home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD ROM Paradise Collection 4
/
CD ROM Paradise Collection 4 1995 Nov.iso
/
program
/
allswag.zip
/
WIN-OS2.SWG
< prev
Wrap
Text File
|
1993-12-08
|
128KB
|
1 lines
SWAGOLX.EXE (c) 1993 GDSOFT ALL RIGHTS RESERVED 00014 WINDOWS & OS2 STUFF 1 05-28-9314:10ALL GREG ESTABROOKS DETCWIN.PAS IMPORT 13 KxO { GREG ESTABROOKS }ππProgram Win3XInf; { Simple Detection routines For Windows 3.X }π { Last Updated March 3/93, Greg Estabrooks }πUsesπ Crt,π Dos;ππVarπ Regs : Registers; { to hold register info }ππFunction Win3X : Boolean;π{ Routine to determine if Windows is currently running }πbeginπ Regs.AX := $4680; { Win 3.x Standard check }π Intr($2F, Regs); { Call Int 2F }π if Regs.AX <> 0 then { if AX = 0 Win in Real mode }π begin { else check For enhanced mode }π Regs.AX := $1600; { Win 3.x Enhanced check }π Intr($2F, Regs); { Call Int 2F }π if Regs.AL in [$00,$80,$01,$FF] then { Check returned value }π Win3X := False { Nope not installed }π elseπ Win3X := True; { Ya it is }π endπ elseπ Win3X := True; { Return True }πend;πππFunction WinVer :Word;π{ Returns a Word containing the version of Win Running }π{ Should only be used after checking For Win installed }π{ Or value returned will be meaningless }πbeginπ Regs.AX := $1600; { Enhanced mode check }π Intr($2F, Regs); { Call Int 2F }π WinVer := Regs.AX; { Return proper value }πend;πππbeginπ ClrScr;π if Win3X thenπ beginπ Writeln('Windows is Running! '); { Display version }π Writeln('Version Running is : ', Lo(WinVer), '.', Hi(WinVer));π endπ elseπ Writeln('Windows is not Running!');πend.π 2 05-28-9314:10ALL GREGORY P. SMITH OS2CHECK.PAS IMPORT 34 Kx»π {πAuthor : GREGORY P. SMITHππ> Is there any way to detect OS/2 (in a Dos box) sessions and Windowsπ> Sessions? I'd like to throw in support For these multitaskers so I canπ> run an idlekey Program.ππActual code is always the best example For me.. Look at this Unit (and useπit, I think you'll like it). Check With someone else if you want toπspecifically detect winslows. This Unit will, however, give up time to anyπmultitasker.π}ππ(* Public Domain Unit by Gregory P. Smith, No Rights Reserved *)π(* ... This also means no guarantees ... *)ππUnit OS_Test; { DESQview, OS/2, & 386 v86 machine Interfaces }ππ{$X+,S-,R-,F-,O-,D-,G-} { extended syntax, nothing else }ππInterfaceππConstπ In_DV : Boolean = False; { are we in DESQview? }π In_VM : Boolean = False; { are we in a 386+ virtual machine? }π In_OS2 : Boolean = False; { are we in OS/2? }ππFunction OS2_GetVersion: Word; { Get OS/2 version # }πFunction DV_GetVersion: Word; { update In_DV and get version # }πFunction DV_Get_Video_Buffer(vseg:Word): Word; { get the alt video buffer }πProcedure DV_Pause; { give up time slice }πProcedure MT_Pause; Inline($cd/$28); { give up time in most multitaskers }πProcedure KillTime; { Release time in any situation }πProcedure DV_begin_Critical; { don't slice away }π Inline($b8/$1b/$10/$cd/$15);πProcedure DV_end_Critical; { allow slicing again }π Inline($b8/$1c/$10/$cd/$15);πProcedure DV_Sound(freq,dur:Integer); { Create a Sound in the Bkg }ππImplementationππFunction OS2_GetVersion: Word; Assembler;πAsmπ MOV AH, 30h { Dos Get Version Call }π INT 21h { AL = major version * 10, AH = minor version }π MOV BH, AH { save minor version }π xor AH, AHπ MOV CL, 10π div CL { divide by 10 to get the major version }π MOV AH, BH { restore minor version }π XCHG AH, AL { AH = major, AL = minor }πend;ππFunction DV_GetVersion: Word; Assembler;πAsmπ MOV CX,'DE' { CX+DX to 'DESQ' (invalid date) }π MOV DX,'SQ'π MOV AX,02B01H { Dos' set date funct. }π INT 21H { call Dos }π CMP AL,0FFH { Was it invalid? }π JE @No_dv { yep, no dv }π MOV AX,BX { AH=major AL=minor }π MOV In_DV,1 { Set In_DV flag }π JMP @DvGv_x { other routines }π @No_dv:π xor AX,AX { Return 0 or no DV }π @DvGv_x:πend; { DV_GetVersion }ππFunction DV_Get_Video_Buffer(vseg:Word): Word; Assembler;πAsm { Modified by Scott Samet April 1992 }π CALL DV_GetVersion { Returns AX=0 if not in DV }π MOV ES,vseg { Put current segment into ES }π TEST AX,AX { In DV? }π JZ @DVGVB_X { Jump if not }π MOV AH,0FEH { DV's get video buffer Function }π INT 10H { Returns ES:DI of alt buffer }π @DVGVB_X:π MOV AX,ES { Return video buffer }πend; { DV_Get_Video_Buffer }ππProcedure DV_Pause;πbeginπ if In_DV thenπ Asmπ MOV AX, 1000h { pause Function }π INT 15hπ end;πend; { DV_Pause }ππProcedure KillTime;πbeginπ if In_VM thenπ Asmπ MOV AX, 1680h { give up VM time slice }π INT 2Fhπ endπ elseπ if In_DV thenπ Asmπ MOV AX, 1000h { DV pause call }π INT 15hπ endπ elseπ MT_Pause; { Dos Idle call }πend;ππ(* Procedure DV_begin_Critical; Assembler;πAsmπ MOV AX,$101B { DV begin critical Function }π INT 15hπend; { DV_begin_Critical }ππProcedure DV_end_Critical; Assembler;πAsmπ MOV AX,$101C { DV end critical Function }π INT 15hπend; { DV_end_Critical } *)ππProcedure DV_Sound(freq,dur:Integer); Assembler; { Sound a tone }πAsmπ MOV AX,1019Hπ MOV BX,freq { frequency above 20 Hz }π MOV CX,dur { duration in clock ticks }π INT 15Hπend;ππ{ ** -- initalization -- ** }ππbeginπ DV_GetVersion; { discard answer. Just update In_DV }π Asmπ MOV AX, 1680hπ INT 2Fh { Gives up time slice in most 386+ virtual machines }π not AL { AL = 00h if supported, remains 80h if not }π MOV CL, 7π SHR AL, CL { move bit 7 to bit 0 For a Boolean }π MOV In_VM, AL { update the flag }π end;π In_OS2 := (OS2_GetVersion >= $0100); { version 1.0 or greater }πend.ππ 3 05-28-9314:10ALL SWAG SUPPORT TEAM WINCHECK.PAS IMPORT 6 Kxτn {π>How can I check from my Dos Program that Windows are running inπ>the background?π}ππUnit Chk4Win;ππInterfaceππTypeπ Win3ModeType = (NoWin, RealStd, Enhanced);ππFunction CheckForWin3 : Win3ModeType;ππImplementationππFunction CheckForWin3 : Win3ModeType; Assembler;πAsmπ mov ax,1600hπ int 2Fhπ cmp al,1π jbe @@CheckRealStdπ cmp al,80hπ jae @@CheckRealStdπ mov al,2π jmp @@ExitPointπ@@CheckRealStd:π mov ax,4680hπ int 2Fhπ or ax,axπ jnz @@notWinπ mov al,1π jmp @@ExitPointπ@@notWin:π xor al,alπ@@ExitPoint:πend;ππend.π 4 05-28-9314:10ALL SWAG SUPPORT TEAM WINICONS.PAS IMPORT 24 Kx£ {π I am writing a Dos based Program in Turbo Pascal 6.0 that Uses aπ GUI Interface. My problem is that I would like to be able to importπ Windows or OS/2 icons to use instead of making my own. Does anyoneπ know the File Format For either of these Files or better yet haveπ source code For displaying them. Any help would be greatly appreciated.ππThe following code is a Unit I wrote to handle Windows icon Files. Iπdon't have the code yet For OS/2 icon Files, although I believe they areπquite similar. As Far as displaying the icons, just pass a Pointerπto the icon to your Graphics routines and let them decode and displayπthe structures. You should also be able to use a subset of theπstructures to decode icons embedded in Windows .EXE Files.ππAt offset $24 in the "new executable" header For Windows and OS/2 .EXEπFiles is a Word Variable that specifies an additional offset to theπresource table.π}ππUnit WinIcons;ππ(********************************)Interface(*********************************)ππTypeπ tBMPInfoHdr = Recordπ vHdrSize, (* Always 40 For Windows icons *)π vPixelWidth,π vPixelHeight : LongInt;π vColorPlanes, (* Should always be 1 *)π vBitCount : Word;π vCompression,π vImageSize,π vXPelsPerMeter,π vYPelsPerMeter,π vClrUsed,π vClrImportant : LongInt;π end;ππ tWinIconColor = Recordπ vBlue,π vGreen,π vRed,π vUnused : Byte;π end;ππ tRGBTable = Array[0..15] of tWinIconColor;ππ txorMask = Array[0..511] of Byte;ππ tandMask = Array[0..127] of Byte;ππ tWinIcon = Record (* The icon itself *)π vBMPInfoHdr : tBMPInfoHdr;π vRGBTable : tRGBTable;π vxorMask : txorMask;π vandMask : tandMask;π end;ππ tWinIconDirEntry = Record (* Icon File directory entry. *)π vIconWidth, (* 1 For each icon in the File *)π vIconHeight,π vColorCount,π vReserved : Byte;π vPlanes,π vBitCount : Word;π vBytesInRes,π vImageoffset : LongInt;π end;ππ (* The following two Arrays have to be sized at run-time as they can *)π (* hold up to 65,535 entries. The actual number of entries is set by *)π (* vIdCount. When reading an icon File, read in the vIdCount Variable *)π (* and then use GetMem to allocate the correct amount of heap. *)ππ tDirListPtr = ^tDirList;π tDirList = Array[1..1] of tWinIconDirEntry;ππ tIconListPtr = ^tIconList;π tIconList = Array[1..1] of tWinIcon;ππ tWinIconFileRec = Recordπ vIdReserved,π vIdType,π vIdCount : Word;π vDirList : tDirListPtr;π vIconList : tIconListPtr;π end;πππ tWinIconFile = File of tWinIconFileRec;ππVarπ vWinIconFile : tWinIconFile; (* Hook to access icon Files *)ππ(******************************)Implementation(******************************)ππend.π 5 08-27-9321:43ALL MICHAEL VINCZE Window painting IMPORT 24 Kx {πmichael a vinczeππBelow I have re-written your Paint method. It is commented where I made theπchanges. Get in touch with me if you have any questions.π}ππprocedure TNumConWindow.Paint(PaintDC : HDC; var PaintInfo : TPaintStruct);πvarπ X, Y : Integer;π WRect : TRect;π DeltaX,π DeltaY,π XSize,π YSize : Integer;π Perc : Real;π Str : string;π PC : PChar;π PCP : Integer;π SaveBK : LongInt;π ThePen : HPen;π TheBrush: HBrush;π TheRect : TRect;ππconstπ CP = 1;π NumLic = 64;π MaxCount = 6;π Count : array [1..MaxCount] of Integer = (2, 4, 8, 16, 32, 64);π OutStr : string = 'Hello Allen E. Stoner ';ππbeginπ GetClientRect(HWindow, WRect);π XSize := WRect.Right - WRect.Left;π YSize := WRect.Bottom - WRect.Top - 40;ππ Perc := YSize / (NumLic * 1.05);π DeltaY := Round(Perc * 10);ππ { Draw fat line at bottom of graph. The color is the system default. }π MoveTo(PaintDC, 0, YSize);π LineTo(PaintDC, XSize, YSize);π MoveTo(PaintDC, 0, YSize + 1);π LineTo(PaintDC, XSize, YSize + 1);π MoveTo(PaintDC, 0, YSize + 2);π LineTo(PaintDC, XSize, YSize + 2);ππ { Draw horizontal lines. The color is the system default. }π Y := YSize;π while Y > 0 doπ beginπ Rectangle(PaintDC, 0, Y, XSize, Y - DeltaY);π Y := Y - (DeltaY * 2);π end;ππ { Fill in rectangle at bottom yellow. This is the same size as WRectπ except the top is at YSize + 3. }π TheBrush := CreateSolidBrush(RGB($FF, $FF, $00));π CopyRect(TheRect, WRect);π TheRect.Top := YSize + 3;π FillRect(PaintDC, TheRect, TheBrush);ππ { Draw vertical lines red. If you wanted to, you could draw rectanglesπ instead of lines. Notice how I've selected a width of 4 for ThePen.π You could also have a different color for each "bar" by having X indexπ into an array of TColorRefs and changing ThePen for each new value of X.}π ThePen := CreatePen(PS_SOLID, 4, RGB($FF, $00, $00));π SelectObject(PaintDC, ThePen);π for X := 1 to MaxCount doπ beginπ MoveTo(PaintDC, X * 10, YSize);π LineTo(PaintDC, X * 10, Round(YSize - (Count[X] * Perc)));π end;ππ if CP = 1 thenπ PCP := 300π elseπ PCP := CP - 1;π PC := @OutStr[1];ππ { Set the color of the text. Note GetSysColor is used merely as an example.π Don't forget that the background of the text must also be colored. Thisπ color should be yellow, as in TheBrush, however a different color wasπ selected for illustration purposes. Alternatively SetBkMode() couldπ be used }π SetTextColor(PaintDC, GetSysColor(COLOR_HIGHLIGHT));π SetBkColor(PaintDC, RGB($00, $FF, $FF));π { Use SetBkMode () instead of SetBkColor () to see what happens.π SetBkMode (PaintDC, TRANSPARENT); }ππ TextOut(PaintDC, 10, YSize+15, PC, Length(OutStr)-1);ππ { Don't forget to delete the selected objects. }π DeleteObject(ThePen);π DeleteObject(TheBrush);πend;π 6 08-27-9322:10ALL MICHAEL VINCZE Window Fonts IMPORT 19 Kx {πMICHAEL A VINCZEππBelow is an example I whipped up that shows how to vary the font in an edit control.πThe method can be extended to other controls as well. Two methods are presented:πusing a stock object to get a fixed font, and using a created font.ππI have not figured out how to get the colors to change though.π}ππprogram Font_Ctl;ππusesπ Win31, WinTypes, WinProcs,π Objects, OWindows, ODialogs;ππconstπ ApplicationName : PChar = 'Font_Ctl';ππ id_Edit1 = 201;π id_Edit2 = 202;π id_Edit3 = 203;ππtypeπ TFont_CtlApplication = object (TApplication)π procedure InitMainWindow; virtual;π end;ππ PFont_CtlWindow = ^TFont_CtlWindow;π TFont_CtlWindow = object (TWindow)π EditBox : PEdit;π VarFont : HFont;π FixFont : THandle;ππ constructor Init(AParent : PWindowsObject; ATitle : PChar);π procedure SetupWindow; virtual;π destructor Done; virtual;π end;ππprocedure TFont_CtlApplication.InitMainWindow;πbeginπ MainWindow := New(PFont_CtlWindow, Init(nil, ApplicationName));πend;ππconstructor TFont_CtlWindow.Init(AParent : PWindowsObject; ATitle : PChar);πbeginπ inherited Init(AParent, ATitle);π EditBox := New(PEdit, Init (@Self, id_Edit1, 'EditBox 1 (normal)',π 10, 10, 500, 30, $FF, False));π EditBox := New(PEdit, Init (@Self, id_Edit2, 'EditBox 2 (fixed font)',π 10, 50, 500, 30, $FF, False));π EditBox := New(PEdit, Init (@Self, id_Edit3, 'EditBox 3 (variable font)',π 10, 90, 500, 30, $FF, False));π FixFont := GetStockObject (System_Fixed_Font);ππ VarFont := CreateFont(20, 20, 0, 0, fw_DontCare, 0, 0, 0,π Default_CharSet, Out_Default_Precis,π Clip_Default_Precis, Default_Quality,π Variable_Pitch or ff_DontCare, nil);πend;ππdestructor TFont_CtlWindow.Done;πbeginπ inherited Done;π DeleteObject(VarFont);πend;ππprocedure TFont_CtlWindow.SetupWindow;πbeginπ inherited SetupWindow;π SendMessage(GetDlgItem (HWindow, id_Edit2), wm_SetFont, FixFont, 1);π SendMessage(GetDlgItem (HWindow, id_Edit3), wm_SetFont, VarFont, 1);πend;ππvarπ Application : TFont_CtlApplication;ππbeginπ Application.Init (ApplicationName);π Application.Run;π Application.Done;πend.π 7 08-27-9322:10ALL SCOTT SAMET "About" box in Windows IMPORT 15 Kx {πSCOTT SAMETππ> I have a program that is always an icon, but I want to add an "about"π> command to it, to display a dialog box with info on the author andπ> the program. Anyone know how to do this or where info on it can be found?ππAll system menu commands, even those you add, are returned as wm_SysCommandπmessages. You need to check wParam to see if it's one of yours, and if not,πpass it to DefWndProc.π}ππUsesπ OWindows, WinProcs, WinTypes;ππConstπ cm_About = 100;ππTypeπ TMyApp = Object(TApplication)π Procedure InitMainWindow; Virtual;π end;ππ PMyWin = ^TMyWin;π TMyWin = Object(TWindow)π Procedure SetupWindow; Virtual;π Procedure wmSysCommand(Var Msg : TMessage);π virtual wm_First + wm_SysCommand;π Procedure wmQueryOpen(Var Msg : TMessage);π virtual wm_First + wm_QueryOpen;π end;ππProcedure TMyApp.InitMainWindow;πBeginπ MainWindow := New(PMyWin, Init (Nil, 'Test Window'));π { This gives the window a system menu with Move, Switch and Close }π PWindow(MainWindow)^.Attr.Style := ws_Overlapped or ws_Sysmenu;πend;ππProcedure TMyWin.SetupWindow;πVarπ SysMenu: hMenu;πBeginπ SysMenu := GetSystemMenu(hWindow, False);π AppendMenu(SysMenu, mf_Separator, 0, Nil);π AppendMenu(SysMenu, mf_String, cm_About, '&About');πend;ππProcedure TMyWin.wmQueryOpen(Var Msg : TMessage);πBeginπ { This keeps the window an icon at all times }π Msg.Result := 0;πend;ππProcedure TMyWin.wmSysCommand(Var Msg : TMessage);πBeginπ Case Msg.wParam ofπ cm_About :π MessageBox(hWindow, 'About Text', 'About Box', mb_ok)π Elseπ DefWndProc (Msg);π end;πend;ππVarπ App: TMyApp;πBeginπ CmdShow := sw_ShowMinimized;π App.Init ('Test');π App.Run;π App.Done;πend.π 8 11-26-9316:55ALL BARRY NAUJOK View Windows BMP Files SWAG9311 221 Kx {π-----------------------------------------------------------------------------πProgram BMPView; { by Barry Naujok, 1993, written in TP7 }π { This information was completely derived on my own (ALL of it). }π { If there are any errors or omisions, please let me know at ... }π { a1357665@cfs01.cc.monash.edu.au }π { Currently only supports 3-256 colours (not monochrome or true colour) }π { My opinion: As can be seen from decoding a BitMaP, I truly believe }π { that Microsoft is a bit backwards! :) (other opinions welcome) }ππUses VESA,Crt,Dos,Strings;ππConst bufsize=32000; { my optimal buffer size, could be bigger for other drives }π { Has to be even for the RLE decompression }πType THeader=Recordπ ID : Word; { 'BM' for a Windows BitMaP }π FSize : LongInt; { Size of file }π Ver : LongInt; { BMP version (?), currently 0 }π Image : LongInt; { Offset of image into file }π Misc : LongInt; { Unknown, appears to be 40 for all files }π Width : LongInt; { Width of image }π Height: LongInt; { Height of image }π Num : Word; { Not sure, possibly number of images or planes (1) }π Bits : Word; { Number of bits per pixel }π Comp : LongInt; { Type of compression, 0 for uncompressed, 1,2 for RLE }π ISize : LongInt; { Size of image in bytes }π XRes : LongInt; { X dots per metre (not inches! for US, unbelievable!) }π YRes : LongInt; { Y dots per metre }π PSize : LongInt; { Palette size (number of colours) if not zero }π Res : LongInt; { Probably reserved, currently 0 }π End; { 54 bytes }ππ PByte = ^Byte;ππ TPalette = Recordπ b,g,r,x : Byte; { BMP uses a fourth byte for the palette, not used }π End;ππVar fl : File;π header : THeader;π buffer : PByte;ππProcedure BlankPalette;πVar pal : Array[0..767] Of Byte;π r : Registers;πBeginπ FillChar(pal,768,0);π r.ax:=$1012;π r.bx:=0;π r.cx:=256;π r.dx:=Ofs(pal);π r.es:=Seg(pal);π Intr($10,r);πEnd;ππProcedure SetPalette;πConst Pal16:Array[0..15]Of Byte=(0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63);πVar palette : TPalette; { ^ Actual BIOS palette numbers for 16 colour modes }π BIOSpal : Array[0..767] Of Byte;π i : Byte;π r : Registers;πBeginπ For i:=0 To header.PSize-1 Do Beginπ BlockRead(fl,palette,4);π If header.PSize>16 Then Beginπ BIOSpal[i*3]:=palette.r Shr 2;π BIOSpal[i*3+1]:=palette.g Shr 2;π BIOSpal[i*3+2]:=palette.b Shr 2;π End Else Beginπ BIOSpal[Pal16[i]*3]:=palette.r Shr 2;π BIOSpal[Pal16[i]*3+1]:=palette.g Shr 2;π BIOSpal[Pal16[i]*3+2]:=palette.b Shr 2;π End;π End;π r.ax:=$1012;π r.bx:=0;π r.cx:=256;π r.dx:=Ofs(BIOSpal);π r.es:=Seg(BIOSpal);π Intr($10,r);πEnd;ππProcedure ShowImage256(name:PChar); Assembler;πVar dseg,width,height,bytes,rows,bank,handle,cp:Word;πAsmπ Mov dseg,dsπ Mov ax,header.Comp.Word[0]π Mov cp,axπ Mov ax,header.Width.Word[0]π Test ax,1π Jz @0Iπ Inc ax { image is word aligned so adjust width if needed }π @0I: Mov width,axπ Mov ax,header.Height.Word[0]π Mov height,axπ Mov di,axπ Dec diπ Mov ax,VesaMode.Bytesπ Mov bytes,axπ Mov ax,VesaMode.Heightπ Mov rows,axπ Mov es,VesaMode.SegAππ Mov ax,$3D00π Lds dx,nameπ Int $21 { Open the file for assembler }π Mov ds,dseg { Restore the data segment }π Jc @Exπ Mov handle,axππ Mov bx,axπ Mov ax,$4200π Mov cx,header.Image.Word[2]π Mov dx,header.Image.Word[0]π Int $21 { Seek to image location }π Call @FRπ Jmp @0Nππ @FR: Push axπ Push cxπ Push dxπ Mov ds,dsegπ Mov bx,handleπ Mov cx,bufsizeπ Lds si,bufferπ Mov dx,siπ Mov ah,$3Fπ Int $21π Mov bx,ax { Bytes left to read from the buffer }π Pop dxπ Pop cxπ Pop axπ RetNππ @0N: Mov ax,bytesπ Mul diπ Mov di,axπ Mov bank,dxπ Call @B1 { Set the last line & bank }π Mov dx,widthππ Cmp cp,0π Je @0Sππ { RLE bitmap }π @1S: Xor dx,dx { Set DX as the width count }π @10: Xor ah,ah { Clear upper byte }π Lodsb { Get "index" byte }π Dec bx { Decrement buffer count }π Jnz @11 { Jump if not empty }π Call @FR { Reload buffer }π @11: Or al,alπ Jz @14 { Jump if following is a string }π { Repeat byte }π Mov cx,ax { else "index" is a repeat count }π Add dx,cxπ Lodsb { Load data to repeat "index" times }π Dec bxπ Jnz @12 { Jump if buffer isn't empty }π Call @FRπ @12: Stosb { Draw byte to screen }π Or di,di { Check to see if line crosses bank }π Jnz @13π Inc bank { Change bank if crossed }π Call @B1π @13: Loop @12 { Store all repeated bytes }π Jmp @10π { Dump string }π @14: Lodsb { Load "count", number of bytes in the string }π Mov cx,axπ Add dx,cxπ Dec bxπ Jnz @1T { Update buffer count (& buffer contents) }π Call @FRπ @1T: Or al,alπ Jz @20π @15: Movsb { Transfer string to screen }π Or di,diπ Jnz @16 { bank checking }π Inc bankπ Call @B1π @16: Dec bx { Update buffer count, etc }π Jnz @17π Call @FRπ @17: Loop @15 { Repeat for string }π Test al,1 { See if there was an odd numbered count }π Jz @10 { Jump if even }π Lodsb { Clear extra byte, due to word alignment }π Dec bxπ Jnz @10 { Update buffer count, etc }π Call @FRπ Jmp @10π @20: Sub di,dx { Move screen pointer to start of line }π Jnc @21 { Jump if not crossed bank }π Dec bank { Update bank if crossed }π Call @B1π @21: Sub di,bytes { Move to screen line above }π Jnc @23 { Jump if not crossed bank }π Dec bank { Update bank if crossed }π Call @B1π @23: Dec height { Update line count }π Jnz @1S { Jump to start if not end of the image }π Jmp @Ex { Exit if image drawn }ππ { Un-compressed bitmap }π @0S: Mov cx,dxπ Mov ax,diπ Add ax,cxπ Jc @03 { Jump if line crosses bank }π Cmp bx,cxπ Jle @03 { Jump if file buffer will run out }π Sub bx,cx { Update buffer counter }π Shr cx,1π Jnc @01π Movsbπ @01: Rep Movsw { Show line }π Sub di,dx { Go to next line (above) }π Sub di,bytesπ Jnc @02π Dec bank { See if line above is in another bank }π Call @B1π @02: Dec heightπ Jnz @0Sπ Jmp @Exπ @03: Movsbπ Or di,diπ Jnz @04π Inc bankπ Call @B1π @04: Dec bxπ Jnz @05π Call @FRπ @05: Loop @03π Sub di,dxπ Jnc @06π Dec bankπ Call @B1π @06: Sub di,bytesπ Jnc @07π Dec bankπ Call @B1π @07: Dec heightπ Jnz @0Sπ Jmp @Exπππ { Set bank }π @B1: Push axπ Push dsπ Mov ds,dsegπ Mov al,vesaonπ Or al,alπ Jz @B3π Push bxπ Push dxπ Mov dx,bankπ Xor bx,bxπ Mov ax,64π Mul dxπ Div VesaMode.Granπ Mov dx,axπ Push dxπ Call VesaMode.WinFuncπ Pop dxπ Inc bxπ Call VesaMode.WinFuncπ Pop dxπ Pop bxπ @B3: Pop dsπ Pop axπ RetNπ @Ex: Mov ds,dsegπ Mov bx,handle { Close the file }π Mov ah,$3Eπ Int $21πEnd;ππProcedure ShowImage16(name:PChar); Assembler;πVar dseg,width,height,bytes,rows,bank,handle,cp,rc,bc:Word;πAsmπ Mov dseg,dsπ Mov ax,header.Comp.Word[0]π Mov cp,axπ Mov ax,header.Width.Word[0]π Mov width,axπ Mov ax,header.Height.Word[0]π Mov height,axπ Mov di,axπ Dec diπ Mov ax,VesaMode.Bytesπ Mov bytes,axπ Mov ax,VesaMode.Heightπ Mov rows,axπ Mov es,VesaMode.SegAππ Mov ax,$3D00π Lds dx,nameπ Int $21 { Open the file for assembler }π Mov ds,dseg { Restore the data segment }π Jc @Exπ Mov handle,axππ Mov bx,axπ Mov ax,$4200π Mov cx,header.Image.Word[2]π Mov dx,header.Image.Word[0]π Int $21 { Seek to image location }π Call @FRπ Jmp @0Nππ @FR: Push axπ Push bxπ Push cxπ Push dxπ Mov ds,dsegπ Mov bx,handleπ Mov cx,bufsizeπ Lds si,bufferπ Mov dx,siπ Mov ah,$3Fπ Int $21π Mov bc,ax { Bytes left to read from the buffer }π Pop dxπ Pop cxπ Pop bxπ Pop axπ RetNππ @0N: Mov ax,bytesπ Mul diπ Mov di,axπ Mov bank,dxπ Call @B1 { Set the last line & bank }π Mov dx,$3CEπ Mov ax,$205π Out dx,ax { Set Write Mode 2 }π Mov ax,$8008 { Initial bit mask }ππ Cmp cp,0π Je @0Sππ { RLE bitmap }π @1S: Mov rc,0π Mov ax,$8008π @10: Xor ch,ch { Clear upper byte }π Mov cl,[si] { Get "index" byte }π Inc siπ Dec bc { Decrement buffer count }π Jnz @11 { Jump if not empty }π Call @FR { Reload buffer }π @11: Or cl,clπ Jz @14 { Jump if following is a string }π { Repeat byte }π Shr cl,1 { Divide the "index" by two }π Mov bl,[si] { Load data to repeat "index" times }π Inc siπ Dec bcπ Jnz @12 { Jump if buffer isn't empty }π Call @FRπ @12: Rol bl,4π Out dx,axπ Mov bh,es:[di]π Mov es:[di],bl { Update screen }π Ror ah,1π Jnc @1Bπ Inc diπ Jnc @1Bπ Inc bank { Change bank if crossed }π Call @B1π @1B: Out dx,axπ Rol bl,4π Mov bh,es:[di]π Mov es:[di],blπ Ror ah,1π Jnc @13π Inc diπ Inc rcπ Jnc @13π Inc bank { Change bank if crossed }π Call @B1π @13: Loop @12 { Store all repeated bytes }π Jmp @10π { Dump string }π @14: Mov cl,[si] { Load "count", number of bytes in the string }π Inc siπ Dec bcπ Jnz @1E { Update buffer count (& buffer contents) }π Call @FRπ @1E: Or cl,clπ Jz @20π Shr cl,1 { Divide the "count" by 2 }π Push cxπ @15: Mov bl,[si]π Inc siπ Rol bl,4π Out dx,axπ Mov bh,es:[di]π Mov es:[di],blπ Ror ah,1π Jnc @1Aπ Inc diπ Jnz @1A { bank checking }π Inc bankπ Call @B1π @1A: Out dx,axπ Rol bl,4π Mov bh,es:[di]π Mov es:[di],blπ Ror ah,1π Jnc @16π Inc diπ Inc rcπ Jnz @16π Inc bankπ Call @B1π @16: Dec bc { Update buffer count, etc }π Jnz @17π Call @FRπ @17: Loop @15 { Repeat for string }π Pop cxπ Test cl,1 { See if there was an odd numbered count }π Jz @10 { Jump if even }π Mov cl,[si] { Clear extra byte, due to word alignment }π Inc siπ Dec bcπ Jnz @10 { Update buffer count, etc }π Call @FRπ Jmp @10π @20: Sub di,rc { Move screen pointer to start of line }π Jnc @21 { Jump if not crossed bank }π Dec bank { Update bank if crossed }π Call @B1π @21: Sub di,bytes { Move to screen line above }π Jnc @22 { Jump if not crossed bank }π Dec bank { Update bank if crossed }π Call @B1π @22: Dec height { Update line count }π Jnz @1S { Jump to start if not end of the image }π Jmp @Ex { Exit if image drawn }ππ { Un-compressed bitmap }π @0S: Mov ax,widthπ Xor bx,bxπ Mov rc,ax { Initialize rowcount }π Mov ax,$8008π @02: Out dx,ax { Update bit mask register }π Mov cl,[si] { Load a byte (2 pixels) }π Inc si { Update buffer pointer }π Dec bc { Updata buffer count }π Jnz @03π Call @FR { Reload buffer if necessary }π @03: Ror cl,4 { Move 1st pixel in low part of CL }π Mov ch,es:[di] { Load latches }π Mov es:[di],cl { Update latches }π Ror ah,1 { Shift bit mask right a pixel }π Out dx,ax { Update bit mask register }π Ror cl,4 { Move 2nd pixel in low part of CL }π Mov ch,es:[di] { as above 3 steps }π Mov es:[di],cl { ... }π Sub rc,2π Jle @04π Ror ah,1π Jnc @02π Inc diπ Inc bxπ Jnc @02π Inc bankπ Call @B1π Jmp @02π @04: Mov ax,si { Discard extra bytes for }π Mov cx,4 { LongInt alignment (?) }π And ax,3π Sub cx,axπ And cx,3π Add si,cxπ Sub bc,cxπ Sub di,bxπ Jnc @06π Dec bankπ Call @b1π @06: Sub di,bytesπ Jnc @07π Dec bankπ Call @b1π @07: Dec heightπ Jnz @0Sπ Jmp @Exππ { Set bank }π @B1: Push axπ Push dsπ Mov ds,dsegπ Mov al,vesaonπ Or al,alπ Jz @B3π Push bxπ Push dxπ Mov dx,bankπ Xor bx,bxπ Mov ax,64π Mul dxπ Div VesaMode.Granπ Mov dx,axπ Push dxπ Call VesaMode.WinFuncπ Pop dxπ Inc bxπ Call VesaMode.WinFuncπ Pop dxπ Pop bxπ @B3: Pop dsπ Pop axπ RetNπ @Ex: Mov ds,dsegπ Mov bx,handle { Close the file }π Mov ah,$3Eπ Int $21πEnd;πProcedure ShowBMP;πVar fn:Array[0..63]Of Char;πBeginπ StrPCopy(fn,ParamStr(1));π GetMem(buffer,bufsize);π Case header.PSize Ofπ 1..16: Beginπ Case header.Width Ofπ 0..640 : SetMode($12);π 641..800 : SetMode($102);π 801..1024 : SetMode($104);π 1025..9999 : SetMode($106);π End;π BlankPalette;π ShowImage16(fn);π End;π 17..256: Beginπ Case header.Width Ofπ 0..320 : SetMode($13);π 321..640 : SetMode($101);π 641..800 : SetMode($103);π 801..1024 : SetMode($105);π 1025..9999 : SetMode($107);π End;π BlankPalette;π ShowImage256(fn);π End;π End;ππ FreeMem(buffer,bufsize);π SetPalette;π Sound(660);π Delay(100);π Sound(880);π Delay(50);π Sound(440);π Delay(75);π NoSound;ππ ReadKey;π SetMode(3);πEnd;ππProcedure SetPSize;πBeginπ If header.PSize=0 Then Case header.Bits Ofπ 1 : header.PSize:=2; { These are the only valid bits in a BMP }π 4 : header.PSize:=16;π 8 : header.PSize:=256;π 24: header.PSize:=0; { A 24 bit image does not have a palette }π End;πEnd;ππBeginπ If ParamCount>0 Then Beginπ Assign(fl,ParamStr(1));π {$I-}π Reset(fl,1);π {$I+}π If IOResult=0 Then Beginπ BlockRead(fl,header,54);π If header.ID=$4D42 Then Beginπ SetPSize; { Set the PSize field in the header if not defined }π Writeln;π Writeln('Width . . . . . ',header.Width,' pixels');π Writeln('Height . . . . . ',header.Height,' pixels');π Writeln('Bits per Pixel . ',header.Bits);π Writeln('Palette Size . . ',header.PSize,' colours, ',header.PSize*4,' bytes');π Write('Compression . . type ',header.Comp);π If header.Comp=0 Then Writeln(' (not compressed)')π Else Writeln(' (RLE)');π Writeln('Image Offset . . ',header.Image);π Writeln('Image Size . . . ',header.ISize,' bytes');π Writeln('X Resolution . . ',header.XRes,' D/m, ',header.XRes*254 Div 10000,' DPI');π Writeln('Y Resolution . . ',header.YRes,' D/m, ',header.YRes*254 Div 10000,' DPI');π Writeln;π If ((header.Width<641)And(header.Height<481)And(header.PSize<17))π Or((header.Width<321)And(header.Height<201))Or(IsVesa) Thenπ If header.PSize>2 Then Beginπ Writeln('Press a key to show the image');π ReadKey;π ShowBMP;π End Else Writeln('Cannot display the image without VESA graphics support');π Close(fl);π End Else Writeln('The file is not a Windows BitMaP file');π End Else Writeln('File not found, try again');π End Else Writeln('Usage: BMPVIEW <filename>');πEnd.π-----------------------------------------------------------------------------πUnit VESA;ππInterfaceππType ModeList=Array[1..32] Of Word; { List of VESA mode numbers }ππ TVesaMode=Recordπ Attr : Word; { Mode Attributes }π WinA : Byte; { Window A attributes }π WinB : Byte; { Window B attributes }π Gran : Word; { Window granularity in K bytes }π WinSiz : Word; { Size of window in K bytes }π SegA : Word; { Segment address of window A }π SegB : Word; { Segment address of window B }π WinFunc : Procedure; { Windows positioning function }π Bytes : Word; { Number of bytes per line }π Width : Word; { Number of horizontal pixels }π Height : Word; { Number of vertical pixels }π CharW : Byte; { Width of character cell }π CharH : Byte; { Height of character cell }π Planes : Byte; { Number of memory planes }π Bits : Byte; { Number of bits per pixel }π nBanks : Byte; { Number of banks (not used) }π Model : Byte; { Memory model type }π Banks : Byte; { Size of bank (not used) }π Pages : Byte; { Number of image pages }π Reserved : Byte; { The following are for 15,16,24,32 bit colour modes }π RedMaskSize : Byte; { Size of Red mask in bits }π RedFieldPos : Byte; { Bit position of LSB of Red mask }π GreenMaskSize : Byte; { Size of Green mask in bits }π GreenFieldPos : Byte; { Bit position of LSB of Green mask }π BlueMaskSize : Byte; { Size of Blue mask in bits }π BlueFieldPos : Byte; { Bit position of LSB of Blue mask }π RsvdMaskSize : Byte; { Size of Reserved mask in bits }π RsvdFieldPos : Byte; { Bit pos. of LSB of Reserved mask }π DirColModeInf : Byte; { Direct Colour mode attributes }π Filler : Array[0..215] Of Byte; { Not used - filler }π End;ππ TVesaInfo=Recordπ Signature : LongInt; { Signature - "VESA" }π Version : Word; { VESA Version number }π OEMName : PChar; { Pointer to manufacturer name }π Capabilities : Longint; { Capabilities (Not used) }π List : ^ModeList; { Pointer to list of VESA modes }π TotalMemory : Word; { Number of 64k memory blocks on card }π Filler : Array[1..238] of Byte;π End; { 258 byte size due to bug in the Diamond SpeedStar 24X v1.01 BIOS }πππVar VesaMode : TVesaMode;π { Contains all info needed for drawing on the screen }π VesaInfo : TVesaInfo;π { Contains info on the VESA BIOS Extensions }ππ vesaon : Byte;π { Specifies whether a VESA mode is on or not }ππFunction IsVesa:Boolean;π { Detects whether VESA support is present }πProcedure GetVesaInfo;π { Get Information on VESA modes, etc }πProcedure GetVesaModeInfo(md:Word);π { Get Information on a VESA mode (md) }πFunction SetMode(md:Word):Boolean;π { Sets a video mode (OEM and VESA) }πFunction GetMode:Word;π { Returns the current video mode }πFunction SizeOfVideoState:Word;π { Returns the size of the buffer needed to save the video state }πProcedure SaveVideoState(Var buf);π { Saves the SVGA video state in the buffer }πProcedure RestoreVideoState(Var buf);π { Restores the SVGA video state from the buffer}πProcedure SetBank(bank:Word);π { Set the video bank to draw on }πFunction GetBank:Word;π { Gets the current active video bank }πProcedure SetLineLength(Var len:Word);π { Sets the logical scan line length, returns the actual length set }πFunction GetLineLength:Word;π { Returns the current logical scan line length }πProcedure SetDisplayStart(pixel,line:Word);π { Sets the first pixel and line on the display }πProcedure GetDisplayStart(Var pixel,line:Word);π { Returns the first pixel and line on the display }ππ{---------------------------------------------------------------------------}π{-----------------------------} Implementation {----------------------------}π{---------------------------------------------------------------------------}ππUses Dos;ππVar rp : Registers;ππFunction IsVesa:Boolean;πBeginπ rp.ax:=$4F03;π Intr($10,rp);π IsVesa:=(rp.al=$4F);πEnd;ππProcedure GetVesaInfo;πBeginπ rp.ax:=$4F00;π rp.di:=Ofs(VesaInfo);π rp.es:=Seg(VesaInfo);π Intr($10,rp);πEnd;ππProcedure GetVesaModeInfo(md:Word);πBeginπ rp.ax:=$4F01;π rp.cx:=md;π rp.di:=Ofs(VesaMode);π rp.es:=Seg(VesaMode);π Intr($10,rp);πEnd;ππFunction SetMode(md:Word):Boolean;πBeginπ SetMode:=True; vesaon:=1;π If md>$FF Then Beginπ rp.bx:=md;π rp.ax:=$4F02;π Intr($10,rp);π If rp.ax<>$4F Then SetMode:=False Else GetVesaModeInfo(md);π End Else Beginπ rp.ax:=md;π Intr($10,rp);π VesaMode.Gran:=64; vesaon:=0;π VesaMode.SegA:=$A000;π Case md Of { OEM (standard) video modes }π 1..3,7 : Begin { Text modes }π VesaMode.Width:=80; VesaMode.Height:=25;π If md=7 Then Beginπ VesaMode.Bits:=1; VesaMode.SegA:=$B000;π End Else Beginπ VesaMode.Bits:=4; VesaMode.SegA:=$B800;π End;π VesaMode.Bytes:=160; VesaMode.Model:=0;π End;π $13 : Begin { 320 x 200 x 256 colours, VGA & MCGA }π VesaMode.Width:=320; VesaMode.Height:=200;π VesaMode.Bits:=8; VesaMode.Model:=4;π VesaMode.Bytes:=320;π End;π $12 : Begin { 640 x 480 x 16 colours, VGA only }π VesaMode.Width:=640; VesaMode.Height:=480;π VesaMode.Bits:=4; VesaMode.Model:=3;π VesaMode.Bytes:=80;π End;π $10 : Begin { 640 x 350 x 16 colours, VGA & EGA with 128k+ }π VesaMode.Width:=640; VesaMode.Height:=350;π VesaMode.Bits:=4; VesaMode.Model:=3;π VesaMode.Bytes:=80;π End;π $0E : Begin { 640 x 200 x 16 colours, VGA & EGA }π VesaMode.Width:=640; VesaMode.Height:=200;π VesaMode.Bits:=4; VesaMode.Model:=3;π VesaMode.Bytes:=80;π End;π $0D : Begin { 320 x 200 x 16 colours, VGA & EGA }π VesaMode.Width:=320; VesaMode.Height:=200;π VesaMode.Bits:=4; VesaMode.Model:=3;π VesaMode.Bytes:=40;π End;π Else SetMode:=False;π End;π End;πEnd;ππFunction GetMode:Word;πBeginπ rp.ax:=$4F03;π Intr($10,rp);π GetMode:=rp.bx;πEnd;ππFunction SizeOfVideoState:Word;πBegin { Will save/restore all video states }π rp.ax:=$4F04;π rp.dl:=0;π rp.cx:=$0F; { hardware, BIOS, DAC & SVGA states }π Intr($10,rp);π SizeOfVideoState:=rp.bx;πEnd;ππProcedure SaveVideoState(Var buf);πBeginπ rp.ax:=$4F04;π rp.dl:=1;π rp.cx:=$0F;π rp.es:=Seg(buf);π rp.bx:=Ofs(buf);π Intr($10,rp);πEnd;ππProcedure RestoreVideoState(Var buf);πBeginπ rp.ax:=$4F04;π rp.dl:=2;π rp.cx:=$0F;π rp.es:=Seg(buf);π rp.bx:=Ofs(buf);π Intr($10,rp);πEnd;ππProcedure SetBank(bank:Word);πVar winnum:Word;πBeginπ winnum:=bank*64 Div VesaMode.Gran;π rp.ax:=$4F05;π rp.bx:=0;π rp.dx:=winnum;π Intr($10,rp);π rp.ax:=$4F05;π rp.bx:=1;π rp.dx:=winnum;π Intr($10,rp);πEnd;ππFunction GetBank:Word;πBeginπ rp.ax:=$4F05;π rp.bx:=$100;π Intr($10,rp);π GetBank:=rp.dx;πEnd;ππProcedure SetLineLength(Var len:Word);πBeginπ rp.ax:=$4F06;π rp.bl:=0;π rp.cx:=len;π Intr($10,rp); { dx:=maximum number of scan lines }π len:=rp.cx;πEnd;ππFunction GetLineLength:Word;πBeginπ rp.ax:=$4F06;π rp.bl:=1;π Intr($10,rp); { dx:=maximum number of scan lines }π GetLineLength:=rp.cx;πEnd;ππProcedure SetDisplayStart(pixel,line:Word);πBeginπ rp.ax:=$4F07;π rp.bx:=0;π rp.cx:=pixel;π rp.dx:=line;π Intr($10,rp);πEnd;ππProcedure GetDisplayStart(Var pixel,line:Word);πBeginπ rp.ax:=$4F07;π rp.bx:=1;π Intr($10,rp);π pixel:=rp.cx;π line:=rp.dx;πEnd;ππEnd.π 9 11-21-9309:25ALL ELM MORROW Load Bitmaps SWAG9311 25 Kx {πFrom: ELM MORROWπSubj: LOADBMPS.PASπ}ππ{$R-}ππunit LoadBMPs;ππinterfaceππuses WinProcs, WinTypes, Strings, WinDos;ππfunction LoadBMP(Name: PChar; Window: hWnd; var DibPal: Word;π var Width, Height: LongInt): hBitMap;ππimplementationππfunction CreateBIPalette(BI: PBitMapInfoHeader): HPalette;πtypeπ ARGBQuad = Array[1..5000] of TRGBQuad;πvarπ RGB: ^ARGBQuad;π NumColors: Word;π Pal: PLogPalette;π hPal: hPalette;π I: Integer;πbeginπ CreateBiPalette := 0;π RGB := Ptr(Seg(BI^), Ofs(BI^)+BI^.biSize);π if BI^.biBitCount<24 thenπ beginπ NumColors:= 1 shl BI^.biBitCount;π if NumColors<>0 thenπ beginπ GetMem(Pal, SizeOf(PLogPalette)+NumColors*SizeOf(TPaletteEntry));π Pal^.palNumEntries := NumColors;π Pal^.palVersion := $300;π for I := 0 to NumColors-1 doπ beginπ Pal^.palPalEntry[I].peRed := RGB^[I].rgbRed;π Pal^.palPalEntry[I].peGreen := RGB^[I].rgbGreen;π Pal^.palPalEntry[I].peBlue := RGB^[I].rgbBlue;π Pal^.palPalEntry[I].peFlags := 0;π end;π hPal := CreatePalette(Pal^);π FreeMem(Pal, SizeOf(PLogPalette) + NumColors * SizeOf(TPaletteEntry));π CreateBiPalette := hPal;π end;π end;πend;ππfunction LoadBMP(Name: PChar; Window: hWnd; var DibPal: Word;π var Width, Height: LongInt): hBitMap;πvarπ BitMapFileHeader: TBitMapFileHeader;π DibSize, ReadSize, ColorTableSize, TempReadSize: LongInt;π DIB: PBitMapInfoHeader;π TempDib: Pointer;π Bits: Pointer;π F: File;π BitMap: hBitMap;π Handle: Word;π DC: hDC;π OldCursor: HCursor;πbeginπ Assign(F, Name);π {$I-}Reset(F, 1);{$I+}π if IOResult<>0 thenπ beginπ LoadBMP := 0;π Exit;π end;π OldCursor := SetCursor(LoadCursor(0, IDC_Wait));π BlockRead(F, BitMapFileHeader, SizeOf(BitMapFileHeader));π DibSize := BitMapFileHeader.bfSize - BitMapFileHeader.bfOffBits;π ReadSize := LongInt(BitMapFileHeader.bfSize) - SizeOf(BitMapFileHeader);π Handle := GlobalAlloc(GMem_Moveable, ReadSize);π DIB := GlobalLock(Handle);π TempReadSize := ReadSize;π TempDib := Dib;π while TempReadSize > 0 doπ beginπ if TempReadSize > $8000 thenπ beginπ BlockRead(F, TempDIB^, $8000);π if Ofs(TempDib^) = $8000 thenπ TempDib := Ptr(Seg(TempDib^) + 8, 0)π elseπ TempDib := Ptr(Seg(TempDib^), $8000);π endπ elseπ BlockRead(F, TempDIB^, TempReadSize);π Dec(TempReadSize, $8000);π end;π if DIB^.biBitCount = 24 thenπ ColorTableSize := 0π elseπ ColorTableSize := LongInt(1) shl DIB^.biBitCount * SizeOf(TRGBQuad);π Bits := Ptr(Seg(DIB^), Ofs(DIB^) + DIB^.biSize + ColorTableSize);π Close(F);π DC := GetDC(Window);π DibPal := CreateBIPalette(DIB);π if DibPal = 0 thenπ beginπ SelectPalette(DC, DibPal, false);π RealizePalette(DC);π end;π BitMap := CreateDIBitMap(DC, DIB^, cbm_Init, Bits, PBitMapInfo(Dib)^,π dib_RGB_Colors);π Height := DIB^.biHeight;π Width := DIB^.biWidth;π ReleaseDC(Window, DC);π GlobalUnLock(Handle);π GlobalFree(Handle);π LoadBMP := BitMap;π SetCursor(OldCursor);πend;ππend.π 10 11-26-9317:49ALL FRANK YOUNG Booting under Windows SWAG9311 16 Kx {πRebooting in itself is rather easy to do...call the right interrupt withπthe right values and you go it--most of the time. I'd noticed that anyπreboot I tried to do from my program under windows would fail. I'm not aπwindows programmer and seldom use it, but I do have one program that needsπto be able to call this routine under certain conditions. A clean rebootπis favored to a lock up or data corruption. I searched for pascal sourceπto work under win, but found none. I finally ran into a short .com fileπwhich did in fact work. I ran the code through a .com to pas inlineπconversion utility and ended up with pages of ugly code. I finally gotπaround to converting it into inline assembly code which shortened things upπsubstantially (10 pages or so-the inline tranlsation was bad, loops wereπiterative/non existant). I then killed the code not necessary for pascal,πand this is what I ended up with:π}ππUNIT BOOTSYS;π(* Unit for unconditional reboot (TESTED UNDER DOS 5/6 & WIN 3.0/3.1) *)π(* (C) Copyright 1993 Frank Young, all rights reserved *)πINTERFACEπ πPROCEDURE REBOOT;ππIMPLEMENTATIONπProcedure Reboot; Assembler;πASMπ MOV AX,CSπ MOV DS,AXπ MOV ES,AXπ MOV SS,AXπ MOV SP,030Dhπ MOV BYTE PTR [00FFh],00π@LOOP1:π CALL @LOOP3π MOV AH,4Chπ INT 21hπ JMP @LOOP1π MOV CX,250π@LOOP2:π ADD [BX+SI],ALπ LOOP @LOOP2π ADD DL,BHπ@LOOP3:π MOV AX,0040hπ MOV DS,AXπ MOV BX,0072hπ MOV WORD PTR [BX],1234hπ@LOOP4:π IN AL,64hπ TEST AL,02hπ JNZ @LOOP4π MOV AL,0D1hπ OUT 64,ALπ XOR AL,ALπ OUT 64,ALπ STIπ MOV CX,0003hπ@LOOP5:π MOV AX,[$006C]π@LOOP6:π CMP AX,[$006C]π JZ @LOOP6πLOOP @LOOP5π CLIπ IN AL,60hπ XOR AX,AXπ MOV DS,AXπ MOV ES,AXπ MOV SS,AXπ MOV SP,AXπ MOV AX,0062hπ CLIπ PUSH AXπ MOV AX,$F000π PUSH AXπ MOV AX,$FFF0π PUSH AXπ XOR AX,AXπ IRETπend;π πend.π 11 11-26-9317:03ALL MICHAEL VINCZE Drag Bitmap SWAG9311 490 Kx π{ PURPOSE : Demonstrate how to smoothly drag a bitmap across an application.ππ AUTHOR : Michael Vincze (mav@asd470.dseg.ti.com)ππ REFERENCE: Microsoft vendor note 4-10.zip (ftp.uu.netπ /vendor/microsoft/developer-network)ππ DATE : 07/25/93π}ππprogram DragBmp;ππusesπ DragUnit,π DragBmp_,π WinTypes,π WinProcs,π OWindows,π ODialogs;ππ{$R DragBmp }ππconstπ ApplicationName: PChar = 'Bitmap Drag';ππtypeπ TDragBmpApplication = object (TApplication)π procedure InitMainWindow; virtual;π end;ππ PDragBmpWindow = ^TDragBmpWindow;π TDragBmpWindow = object (TWindow)π bImageDrawn: boolean; { has the image been drawn? }π bSelected : boolean; { has the image been selected? }π hbmImg : HBITMAP; { handles to image and backdrop }π hbmbk : HBITMAP;ππ constructor Init (AParent: PWindowsObject; ATitle: PChar);π procedure SetupWindow; virtual;π destructor Done; virtual;π procedure GetWindowClass (var AWndClass: TWndClass); virtual;ππ procedure WMLButtonDown (var Msg: TMessage); virtual wm_First + wm_LButtonDown;π procedure WMMouseMove (var Msg: TMessage); virtual wm_First + wm_MouseMove;π procedure WMLButtonUp (var Msg: TMessage); virtual wm_First + wm_LButtonUp;π procedure WMPaint (var Msg: TMessage); virtual wm_First + wm_Paint;ππ procedure CMDrawBmp (var Msg: TMessage); virtual cm_First + cm_DrawBmp;π procedure CMAbout (var Msg: TMessage); virtual cm_First + cm_About;π end;ππprocedure TDragBmpApplication.InitMainWindow;πbeginπMainWindow := New (PDragBmpWindow, Init (nil, ApplicationName));πend;ππconstructor TDragBmpWindow.Init (AParent: PWindowsObject; ATitle: PChar);πbeginπinherited Init (AParent, ATitle);πAttr.Menu := LoadMenu (hInstance, 'Main');πhbmImg := LoadBitmap (hInstance, 'Object');πhbmBk := LoadBitmap (hInstance, 'BackGround');πbImageDrawn := False;πbSelected := False;πend;ππdestructor TDragBmpWindow.Done;πbeginπinherited Done;πif hbmImg <> 0 thenπ beginπ if bImageDrawn = TRUE thenπ DeleteImageπ elseπ DeleteObject (hbmImg);π end;πif hbmBk <> 0 thenπ DeleteObject (hbmBk);πend;ππprocedure TDragBmpWindow.GetWindowClass (var AWndClass : TWndClass);πbeginπinherited GetWindowClass (AWndClass);πAWndClass.HIcon := LoadIcon (HInstance, ApplicationName);πend;ππprocedure TDragBmpWindow.SetupWindow;πbeginπinherited SetupWindow;πend;ππprocedure TDragBmpWindow.WMLButtonDown (var Msg: TMessage);πbeginπif bImageDrawn = TRUE thenπ beginπ bSelected := IsSelected (LOWORD (Msg.lParam), HIWORD(Msg.lParam));π if bSelected = TRUE thenπ BeginDrag (HWindow, LOWORD (Msg.lParam), HIWORD (Msg.lParam));π end;πend;ππprocedure TDragBmpWindow.WMMouseMove (var Msg: TMessage);πbeginπif bSelected = TRUE thenπ Drag (HWindow, LOWORD (Msg.lParam), HIWORD (Msg.lParam));πend;ππprocedure TDragBmpWindow.WMLButtonUp (var Msg: TMessage);πbeginπif bSelected = TRUE thenπ beginπ EndDrag (HWindow, LOWORD (Msg.lParam), HIWORD (Msg.lParam));π bSelected := FALSE;π end;πend;ππprocedure TDragBmpWindow.WMPaint (var Msg: TMessage);πvarπ ps: TPaintStruct;πbeginπBeginPaint (hWindow, ps);ππif hbmBk <> 0 thenπ DrawBackdrop (ps.hdc, hbmBk);ππif bImageDrawn = TRUE thenπ DrawImage (ps.hdc);ππEndPaint (hWindow, ps)πend;ππprocedure TDragBmpWindow.CMDrawBmp (var Msg: TMessage);πvarπ Menu: HMenu;π Rect : TRect;πbeginπ{ Initialize image info }πbImageDrawn := TRUE;πInitImageInfo (hWindow, hbmImg, 100, 100);ππ{ Once drawn, disable and gray this menuitem }πMenu := GetMenu (hWindow);πEnableMenuItem (Menu, cm_DrawBmp, MF_BYCOMMAND or MF_DISABLED or MF_GRAYED);πDrawMenuBar (hWindow);πend;ππprocedure TDragBmpWindow.CMAbout (var Msg: TMessage);πbeginπApplication^.ExecDialog (New (PDialog, Init (@Self, 'About')));πend;ππvarπ Application:TDragBmpApplication;ππbeginπApplication.Init (ApplicationName);πApplication.Run;πApplication.Done;πend.ππ---------- CUT HERE ---------- DRAGUNIT.PAS ----------ππ{ ****************************************************************************π File: DragUnit.pasππ Purpose: Contains bitmap dragging routines.ππ Functions:π InitImageInfo()π DrawImage()π DeleteImage()π DrawBackdrop()π IsSelected()π BeginDrag()π Drag()π EndDrag()ππ Development Team:π Michael Vinczeπ Patrick Schreiberππ Written by Vincze International.π Adopted from Microsoft Product Support Services, Windows Developer Supportππ COPYRIGHT:ππ (C) Copyright Vincze International, 1993.π (C) Copyright Microsoft Corp. 1993. All rights reserved.ππ You have a royalty-free right to use, modify, reproduce andπ distribute the Sample Files (and/or any modified version) inπ any way you find useful, provided that you agree thatπ Vincze International and Microsoft have no warranty obligationsπ or liability for any Sample Application Files which are modified.ππ **************************************************************************** }ππunit DragUnit;ππinterfaceππusesπ WinTypes,π WinProcs;ππ{ force C types }πtypeπ POINT = TPoint;π RECT = TRect;π BITMAP = TBitmap;π BOOL = boolean;ππprocedure InitImageInfo (hWnd_: HWND; hbm: HBITMAP; nX, nY: integer);πprocedure DeleteImage;πfunction IsSelected (nX, nY: integer): BOOL;πprocedure BeginDrag (hWnd_: HWND; nX, nY: integer);πprocedure Drag (hwnd_: HWND; nX, nY: integer);πprocedure EndDrag (hwnd_: HWND; nX, nY: integer);πprocedure DrawBackdrop (hdc_: HDC; hbm: HBITMAP);πprocedure DrawImage (hdc_: HDC);ππimplementationππ{ Image data structure }πtypeπ IMAGE= recordπ bmX : integer; { Bitmap origin }π bmY : integer; { Bitmap origin }π bmWidth : integer; { Bitmap width }π bmHeight: integer; { Bitmap height }π hbmImage: HBITMAP; { Image's bitmap }π hbmBkg : HBITMAP; { What's behind our image }π end;ππ{ Global variables to this unit }πvarπ domino : IMAGE; { Image's info }π rcClient: RECT; { Client area bounding rectangle }π xPrev : integer; { Previous mouse position }π yPrev : integer;ππ{ ****************************************************************************π Function: InitImageInfo()ππ Purpose: Initialize info for our object.ππ Parameters:π HDC hdc_ - Handle to window dcπ int nX - X-coordinate of object originπ int nY - Y-coordinate of object originππ Returns:π No return value.ππ Comments:ππ History: Date Author Reasonπ 3/9/92 PES Createdπ 7/23/93 MAV Corrected rect_.right and rect_.bottom toπ reflect the actual update rectangle.π **************************************************************************** }ππprocedure InitImageInfo (hWnd_: HWND; hbm: HBITMAP; nX, nY: integer);πvarπ hdc_, { Handles to window and memory dcs }π hdcMem : HDC;π hbmNew, { Handles to bitmaps }π hbmPrev: HBITMAP;π bm : BITMAP; { BITMAP data structure }π rect_ : RECT; { Invalid rectangle }πbeginπ{ Get window and memory dcs }πhdc_ := GetDC (hWnd_);πhdcMem := CreateCompatibleDC (hdc_);ππ{ Get width and height of bitmap }πGetObject (hbm, sizeof (BITMAP), @bm);ππ{ Initialize image's info and store rect for updating }πrect_.left := nX;πrect_.top := nY;πrect_.right := nX + bm.bmWidth;πrect_.bottom := nY + bm.bmHeight;πdomino.bmX := nX;πdomino.bmY := nY;πdomino.bmWidth := bm.bmWidth;πdomino.bmHeight := bm.bmHeight;πdomino.hbmImage := hbm;ππ{ Create and select a new bitmap to store our background }πhbmNew := CreateCompatibleBitmap (hdc_, bm.bmWidth, bm.bmHeight);πhbmPrev := SelectObject (hdcMem, hbmNew);ππ{ Get the background from the screen }πBitBlt (hdcMem, 0, 0, domino.bmWidth, domino.bmHeight,π hdc_, domino.bmX, domino.bmY, SRCCOPY);ππ{ Tidy up }πSelectObject (hdcMem, hbmPrev);πDeleteDC (hdcMem);πReleaseDC (hWnd_, hdc_);ππ{ Store the new background bitmap }πdomino.hbmBkg := hbmNew;ππ{ Update client area where image is }πInvalidateRect (hWnd_, @rect_, FALSE);πUpdateWindow (hWnd_);πend;πππ{****************************************************************************π Function: DeleteImage()ππ Purpose: Delete image and background bitmaps.ππ Parameters:π None.ππ Returns:π No return value.ππ Comments:ππ History: Date Author Reasonπ 3/9/92 PES Createdππ **************************************************************************** }πprocedure DeleteImage;πbeginπif domino.hbmImage <> 0 then DeleteObject (domino.hbmImage);πif domino.hbmBkg <> 0 then DeleteObject (domino.hbmBkg);πend;πππ{ ****************************************************************************π Function: DrawImage()ππ Purpose: Draws image at it's current position.ππ Parameters:π HDC hdc_ - Handle to window dcππ Returns:π No return value.ππ Comments:ππ History: Date Author Reasonπ 3/9/92 PES Createdππ **************************************************************************** }πprocedure DrawImage (hdc_: HDC);πvarπ hdcMem : HDC; { Handle to memory dc }π hbmPrev: HBITMAP; { Handle to previous bitmap }πbeginπ{ Create a memory dc and select our object's bitmap into it }πhdcMem := CreateCompatibleDC (hdc_);πhbmPrev := SelectObject (hdcMem, domino.hbmImage);ππ{ BitBlt it to the screen }πBitBlt (hdc_, domino.bmX, domino.bmY, domino.bmWidth, domino.bmHeight,π hdcMem, 0, 0, SRCCOPY);ππ{ Tidy up }πSelectObject (hdcMem, hbmPrev);πDeleteDC (hdcMem);πend;πππ{ ****************************************************************************π Function: DrawBackdrop()ππ Purpose: Draws the backdrop bitmap so we know this bitmap draggingπ technique really works for any background.ππ Parameters:π HDC hdc_ - Handle to window dcπ HBITMAP hbm - Handle to backdrop bitmapππ Returns:π No return value.ππ Comments:ππ History: Date Author Reasonπ 3/9/92 PES Createdππ **************************************************************************** }πprocedure DrawBackdrop (hdc_: HDC; hbm: HBITMAP);πvarπ hdcMem : HDC; { Handle to memry dc }π hbmPrev: HBITMAP; { Handle to previous bitmap }π bm : BITMAP; { BITMAP data structure }πbeginπ{ Get dimensions of backdrop bitmap }πGetObject (hbm, sizeof (BITMAP), @bm);ππ{ Create a memory dc and select our backdrop's bitmap into it }πhdcMem := CreateCompatibleDC (hdc_);πhbmPrev := SelectObject (hdcMem, hbm);ππ{ BitBlt it to the upper-left part of client area }πBitBlt (hdc_, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);ππ{ Tidy up }πSelectObject (hdcMem, hbmPrev);πDeleteDC (hdcMem);πend;πππ{ ****************************************************************************π Function: IsSelected()ππ Purpose: Specifies whether our image has been selected for dragging.ππ Parameters:π WORD wX - X-coordinate of mouse positionπ WORD wY - Y-coordinate of mouse positionππ Returns:π Returns TRUE if specified point is in object's bounding rectangle,π FALSE otherwise.ππ Comments:ππ History: Date Author Reasonπ 3/9/92 PES Createdππ **************************************************************************** }ππfunction IsSelected (nX, nY: integer): BOOL;πvarπ pt : POINT; { POINT data structure }π rect_: RECT; { RECT data structure }πbeginπ{ Current mouse position }πpt.x := nX;πpt.y := nY;ππ{ Current bitmap position }πrect_.left := domino.bmX;πrect_.top := domino.bmY;πrect_.right := domino.bmX + domino.bmWidth - 1;πrect_.bottom := domino.bmY + domino.bmHeight - 1;ππ{ Return TRUE if pt in rect of image }πIsSelected := PtInRect (rect_, pt);πend;πππ{ ****************************************************************************π Function: BeginDrag()ππ Purpose: Starts the bitmap dragging process.ππ Parameters:π HWND hWnd_ - Handle to windowπ int nX - X-coordinate of mouse positionπ int nY - Y-coordinate of mouse positionππ Returns:π No return value.ππ Comments:ππ History: Date Author Reasonπ 3/9/92 PES Createdππ **************************************************************************** }πprocedure BeginDrag (hWnd_: HWND; nX, nY: integer);πbeginπ{ Get all mouse messages }πSetCapture (hWnd_);ππ{ Save previous mouse position }πxPrev := nX;πyPrev := nY;ππ{ Get client area rect }πGetClientRect (hWnd_, rcClient);πend;πππ{ ****************************************************************************π Function: Drag()ππ Purpose: Perform the bitmap dragging.ππ Parameters:π HWND hWnd_ - Handle to windowπ int nX - X-coordinate of mouse positionπ int nY - Y-coordinate of mouse positionππ Returns:π No return value.ππ Comments:ππ History: Date Author Reasonπ 3/9/92 PES Createdππ **************************************************************************** }πprocedure Drag (hwnd_: HWND; nX, nY: integer);πvarπ hdc_, { Handles to dcs }π hdcMem : HDC;π hdcNewBkg, { Handles to dcs }π hdcOldBkg: HDC;π hbmNew, { Handles to bitmaps }π hbmNPrev : HBITMAP;π hbmOPrev, { Handles to bitmaps }π hbmPrev,π hbmTemp : HBITMAP;π dx, { Mouse delta x and delta y }π dy : integer;πbeginπ{ Get window and memory dcs for our BitBlt'ing }πhdc_ := GetDC (hWnd_);πhdcMem := CreateCompatibleDC (hdc_);πhdcNewBkg := CreateCompatibleDC (hdc_);πhdcOldBkg := CreateCompatibleDC (hdc_);ππ{ Create a temp bitmap for our new background }πhbmNew := CreateCompatibleBitmap (hdc_, domino.bmWidth, domino.bmHeight);ππ{ Select our bitmaps }πhbmPrev := SelectObject (hdcMem, domino.hbmImage);πhbmNPrev := SelectObject (hdcNewBkg, hbmNew);πhbmOPrev := SelectObject (hdcOldBkg, domino.hbmBkg);ππ{ Calculate delta x and delta y }πdx:= xPrev - nX;πdy:= yPrev - nY;ππ{ Save previous mouse position }πxPrev:= nX;πyPrev:= nY;ππ{ Update image's position }πdec (domino.bmX, dx);πdec (domino.bmY, dy);ππ{ Copy screen to new background }πBitBlt (hdcNewBkg, 0, 0, domino.bmWidth, domino.bmHeight,π hdc_, domino.bmX, domino.bmY, SRCCOPY);ππ{ Replace part of new bkg with old background }πBitBlt (hdcNewBkg, dx, dy, domino.bmWidth, domino.bmHeight,π hdcOldBkg, 0, 0, SRCCOPY);ππ{ Copy image to old background }πBitBlt (hdcOldBkg, -dx, -dy, domino.bmWidth, domino.bmHeight,π hdcMem, 0, 0, SRCCOPY);ππ{ Copy image to screen }πBitBlt (hdc_, domino.bmX, domino.bmY, domino.bmWidth, domino.bmHeight,π hdcMem, 0, 0, SRCCOPY);ππ{ Copy old background to screen }πBitBlt(hdc_, domino.bmX+dx, domino.bmY+dy, domino.bmWidth, domino.bmHeight,π hdcOldBkg, 0, 0, SRCCOPY);ππ{ Tidy up }πSelectObject (hdcMem, hbmPrev);πSelectObject (hdcNewBkg, hbmNPrev);πSelectObject (hdcOldBkg, hbmOPrev);ππ{ Swap old with new background }πhbmTemp := domino.hbmBkg;πdomino.hbmBkg := hbmNew;πhbmNew := hbmTemp;πDeleteObject (hbmNew);ππ{ Tidy up some more }πDeleteDC (hdcMem);πDeleteDC (hdcNewBkg);πDeleteDC (hdcOldBkg);πReleaseDC (hWnd_, hdc_);πend;πππ{ ****************************************************************************π Function: EndDrag()ππ Purpose: Ends the bitmap dragging process.ππ Parameters:π HWND hWnd_ - Handle to windowπ int nX - X-coordinate of mouse positionπ int nY - Y-coordinate of mouse positionππ Returns:π No return value.ππ Comments:ππ History: Date Author Reasonπ 3/9/92 PES Createdπ 3/12/92 PES Added code to restrict domino to visibleπ area of screen.ππ **************************************************************************** }πprocedure EndDrag (hwnd_: HWND; nX, nY: integer);πvarπ hdc_, { Handles to dcs }π hdcMem: HDC;π hdcNewBkg, { Handles to dcs }π hdcOldBkg: HDC;π hbmNew, { Handles to bitmaps }π hbmNPrev : HBITMAP;π hbmOPrev, { Handles to dcs }π hbmPrev,π hbmTemp : HBITMAP;π dx, { Delta x and delta y of mouse }π dy : integer;π x, { X and y for position correction }π y : integer;πbeginπ{ Calculate delta x and delta y }πdx:= xPrev - nX;πdy:= yPrev - nY;ππ{ Check if we've moved since last time }πif (dx <> 0) or (dy <> 0) thenπ beginπ { Get window and memory dcs }π hdc_ := GetDC (hWnd_);π hdcMem := CreateCompatibleDC (hdc_);π hdcNewBkg := CreateCompatibleDC (hdc_);π hdcOldBkg := CreateCompatibleDC (hdc_);ππ { Create a temp bitmap for our new background }π hbmNew := CreateCompatibleBitmap (hdc_, domino.bmWidth, domino.bmHeight);ππ { Select our bitmaps }π hbmPrev := SelectObject (hdcMem, domino.hbmImage);π hbmNPrev := SelectObject (hdcNewBkg, hbmNew);π hbmOPrev := SelectObject (hdcOldBkg, domino.hbmBkg);ππ { Update bitmap's position }π dec (domino.bmX, dx);π dec (domino.bmY, dy);ππ { Copy screen to new background }π BitBlt (hdcNewBkg, 0, 0, domino.bmWidth, domino.bmHeight,π hdc_, domino.bmX, domino.bmY, SRCCOPY);ππ { Replace part of new bkg with old background }π BitBlt (hdcNewBkg, dx, dy, domino.bmWidth, domino.bmHeight,π hdcOldBkg, 0, 0, SRCCOPY);ππ { Copy image to old background }π BitBlt (hdcOldBkg, -dx, -dy, domino.bmWidth, domino.bmHeight,π hdcMem, 0, 0, SRCCOPY);ππ { Copy image to screen }π BitBlt (hdc_, domino.bmX, domino.bmY, domino.bmWidth, domino.bmHeight,π hdcMem, 0, 0, SRCCOPY);ππ { Copy old background to screen }π BitBlt (hdc_, domino.bmX + dx, domino.bmY + dy,π domino.bmWidth, domino.bmHeight,π hdcOldBkg, 0, 0, SRCCOPY);ππ { Clean up }π SelectObject (hdcMem, hbmPrev);π SelectObject (hdcNewBkg, hbmNPrev);π SelectObject (hdcOldBkg, hbmOPrev);ππ { Swap old with new background }π hbmTemp := domino.hbmBkg;π domino.hbmBkg := hbmNew;π hbmNew := hbmTemp;π DeleteObject (hbmNew);ππ { Tidy up }π DeleteDC (hdcMem);π DeleteDC (hdcNewBkg);π DeleteDC (hdcOldBkg);π ReleaseDC (hWnd_, hdc_);π end;ππ{ Reset previous mouse position }πxPrev:= 0;πyPrev:= 0;ππ{ Release mouse capture }πReleaseCapture;ππ{ Make sure our domino stays completely visible }πif domino.bmX < 0 thenπ x:= 0πelse if domino.bmX + domino.bmWidth > rcClient.right thenπ x:= rcClient.right - domino.bmWidthπelseπ x:= domino.bmX;ππif domino.bmY < 0 thenπ y:= 0πelse if domino.bmY + domino.bmHeight > rcClient.bottom thenπ y:= rcClient.bottom - domino.bmHeightπelseπ y:= domino.bmY;ππif (x <> domino.bmX) or (y <> domino.bmY) thenπ beginπ xPrev:= domino.bmX;π yPrev:= domino.bmY;π Drag (hWnd_, x, y);π xPrev := 0;π yPrev := 0;π end;πend;ππend.ππ---------- CUT HERE ---------- DRAGBMP_.PAS ---------- ππunit DragBmp_;ππinterfaceππ{ menu IDs }πconstπ cm_DrawBmp = 101;π cm_About = 102;ππimplementationπend.ππ---------- CUT HERE ---------- DRAGBMP.RC ---------- ππBACKGROUND BITMAP πBEGINπ '42 4D BE 25 00 00 00 00 00 00 3E 00 00 00 28 00'π '00 00 40 01 00 00 F0 00 00 00 01 00 01 00 00 00'π '00 00 80 25 00 00 00 00 00 00 00 00 00 00 00 00'π '00 00 00 00 00 00 00 00 00 00 FF FF FF 00 48 55'π '48 95 56 BE B6 EB 6D AB 62 20 44 91 5B AE B7 6F'π 'D7 FB 7B B6 B6 EF 5D 55 57 5A AB 6A 89 5A 4A 49'π '49 56 B6 D2 24 B5 92 84 92 6A AD E9 ED B6 9A 54'π '08 DA 91 24 F5 75 AD 5B 7D 56 D6 ED FF FE FB DA'π 'DA B5 AD 4A 72 24 94 AA 92 A9 4A AC C9 4A 24 29'π '24 85 59 4F BB 65 75 D5 55 05 26 49 56 DB 76 F6'π 'D7 FD BD BB 6D DD EE B5 B5 56 52 B4 85 49 4A 91'π '55 56 B5 52 12 B5 D1 4A 49 2A A7 7B 6E DD AA 5A'π 'A2 54 48 92 B9 AE DB AD FE D7 77 6E FF BB DD EB'π '55 B5 AD 49 28 52 15 AA AA A9 56 AD 45 6B 02 10'π '92 49 5A D6 DB B7 55 A2 8C 95 52 24 67 75 AD 77'π 'B5 BD ED DB DD F7 7B 56 AB 6A 5A B2 52 88 A8 25'π '55 55 55 52 AB 4A A4 A5 24 B4 A5 2D B6 6D 76 5D'π '51 22 84 88 DA DB 7B DD 6F 6B 5A AF 7B BF D6 DA'π 'D6 8D B5 4C 85 23 2A DA AA AA AA AD 44 B5 09 09'π '49 01 5A DB 6D DB 4D E6 AD 4A 29 23 35 AE D6 97'π 'FD DE EF FA F6 ED 7D 95 2D 72 AA B1 28 4C 45 25'π '55 55 56 A9 53 4D 52 52 24 56 A5 55 DB 76 F5 19'π '52 55 4A 48 6B 7B B5 FA AB 75 BD 6F DF FF EB 76'π 'DA 8D 55 4A 53 11 12 D5 52 8A B5 56 A6 BA 88 94'π '89 91 5A AB 36 DD AA F6 AE 82 90 92 9A D6 6F 2F'π 'FE EF 6B DD 7D AD DE AA B5 7A AA B4 84 24 6A 2A'π 'AD 7D 4A AA C9 52 21 21 B2 25 26 AA ED AB 5B 45'π '51 55 25 24 2B B5 DA FB 6B D5 DE BB F7 FF B5 55'π '49 95 6D 49 29 69 89 55 52 81 B5 2D B6 AD 4A 4A'π '04 94 98 AB 5B 7E F6 BA AE A5 49 49 55 5F 77 56'π 'DE BF 75 D7 6F 7D 6E D5 B6 6A D2 AA 4A 02 52 AA'π 'AD 5E 4A DB 49 73 10 94 A9 22 63 AA B6 D5 AA CD'π '52 AA 92 12 2E EA DA F5 75 EA AF 7E FD EB D9 2E'π '49 AA AD 54 90 AD 25 55 52 A1 B5 35 B7 AE 45 21'π '24 48 94 55 6D BE ED 32 AD 55 B4 A5 5B BB B7 AF'π 'EF 5D F5 D5 D7 DF 76 D1 B7 55 53 52 25 20 8A 4A'π 'AD 5E A2 EB 49 55 28 4A 49 93 2A A2 CB 6B 9A ED'π '6A AA 42 88 35 6E ED 6A D5 F7 5F 7F FF 7E D9 2E'π 'AA B5 AD 44 48 4A 28 B5 52 A1 5D 56 B7 6A 82 92'π '92 24 55 2D 3E DE F5 95 9B 55 B4 22 AA DB 9B 5D'π 'BF 6D F5 EB 5E F5 AA D3 55 4B 5A A8 95 92 D2 8A'π 'AA 8A A3 AD 6A AD 24 24 48 8A A9 52 D5 75 AB 6A'π '74 AA 49 54 57 B6 76 F7 75 DB 5F 5F FB DF 75 2E'π 'AA B6 A5 51 20 24 05 55 25 55 5D 55 4D 55 49 49'π '13 34 92 49 2A AF 5A 55 8B 5D B4 81 2C D5 DD AD'π 'EE B5 F5 F6 B7 76 D2 DA AA D5 5A 82 4A 92 AA 55'π '52 AA AB AA BB AD 92 5A 64 41 24 94 D5 F6 F5 DB'π '75 6A CA 34 5B 6F 6B 7B 5B EF 6F 5F FD DD A5 53'π '55 2A A7 24 94 49 6A AA AD 55 77 6D 64 5A A4 80'π '89 2A 89 21 2E AD 96 AA 96 95 3A 82 B5 BA DD D6'π 'F6 BA DA F5 6F 77 4D AD 56 D5 5C 49 21 92 95 55'π '52 AA DE DA DF B5 09 2B 52 94 52 4A 51 5B 69 55'π '69 6A C5 68 2A 56 B7 35 5D DB B7 AF DD DD 55 56'π 'A9 5A AB 12 4A 25 55 55 55 54 B5 95 A5 6B 52 48'π '24 41 14 98 AD 6E B6 AA 96 AD BA 95 4B B5 DA EE'π 'F3 76 ED 7B BB 77 AB 59 56 A5 B4 A4 94 95 55 55'π '52 AB EF 7A BA AC 94 92 89 16 A9 23 43 5B CA DB'π '6A A9 4B 70 2C 66 B7 5B AE AD 5B D7 76 CE AA B7'π '6D 5B 4D 09 21 55 55 55 55 55 7A D6 D6 EB 21 24'π '52 68 22 48 3C D6 35 24 AD 56 B4 EA 93 DD 6A F6'π 'FB FB F7 7E ED BD 56 D4 C9 6A B2 52 4A 2A AA AA'π 'AA AA EF AB AB 55 4A 49 94 82 CC 95 43 2D EA DB'π '52 F9 AB F0 2C A5 BF 4D B6 AD 5E D7 DB 6D AD 2B'π '36 D5 48 88 92 AA AA D5 55 55 DA AE 5A D6 A4 92'π '22 55 11 21 1C D7 55 B6 DD 87 6D E5 5B 5D 6D FB'π '6B F7 F5 FE BD DB 5A DE CA AA B2 21 25 55 55 2A'π 'A9 56 FF 59 E6 BB 11 24 89 24 4A 4A 61 2A AB 24'π 'A3 79 4B D8 55 6A DB 2E DF 5D 6F DD F7 6E D5 31'π '35 55 84 96 52 AA AA D5 52 A9 B5 57 5D 65 44 49'π '34 89 B2 99 0B 5D B6 DB 5E 96 B7 B2 AA D5 B6 E9'π 'AA F7 DF B7 DD B5 AA EE D6 AA 51 20 C5 55 55 2A'π 'AD 57 FE DA 6A DF A9 92 42 52 04 22 54 5B 6A B6'π 'A9 69 EF 68 B5 16 6D BF 7F AE FA FE BA DE AD 52'π 'A9 52 84 95 2A AA AA D5 52 AB 7B 35 D5 A8 02 24'π '94 94 A9 48 A2 AA 95 A9 56 B7 1E F5 4A ED DB 65'π 'D5 7D BF D5 F7 75 6A AD 56 AE 29 25 55 55 55 55'π '55 6E F6 EE AA 57 54 89 31 21 22 9B 15 95 6E 57'π 'BA CA FB E8 B5 2A AE DD 7F DB F7 7F AD D6 D5 55'π 'AA A0 42 48 4A AA AA AA AA 9B ED 59 57 DA 85 22'π '46 4A 4A 20 64 25 A9 DA 55 BD B7 DA 6A D5 59 B7'π 'DA FF 6D EB 7B 6D AA EA 54 94 94 93 5A 95 55 55'π '55 57 BD D7 DA 35 28 4D 10 91 54 CA 89 9A 56 B5'π 'AB 53 7F 74 95 AA B7 6D 77 BA FF 5E EE DA AD 15'π 'AA A9 25 24 A5 55 55 AD 52 BE F6 9A 35 EB 52 90'π '6A 25 12 12 22 25 AD 56 B6 AE DE FD 65 2A AD DB'π 'DE F7 DB FB DB B6 B2 EA B5 22 48 49 5A AA AA 52'π 'AA 6D ED 75 D6 96 84 4A 82 C9 64 A4 D5 5A A9 AA'π 'D5 59 7B EA 9A D5 55 36 BB ED BE B6 B6 6D 6D 2B'π '49 48 92 92 A5 55 55 AD 55 DB BF D6 B5 6D 51 12'π '54 12 09 92 04 8B 57 6D 5A B7 DF DE A5 2A AB EB'π 'EF BF FB ED EB D2 D2 D4 B2 11 24 A5 5A AA AA 52'π 'AA 37 FD 35 6A B3 0A 64 92 A5 52 24 A9 24 AA 9A'π 'A5 D5 7F BD 5A D5 56 5F BD 7B 77 5B 5E AE AD AB'π '44 A2 49 0A A5 55 55 AE AB EF 6A DA D6 CE A0 89'π '24 94 A4 89 24 AB 5D 75 DF 2D DB 77 45 2B 2D D7'π '77 EE EE F5 F5 59 55 54 91 04 92 55 5A AA AA B1'π '54 3E FF B5 99 B9 09 22 49 21 09 32 49 05 62 AA'π 'A8 DB 7F DE DA D4 EA BE EE DB FD AF AA D6 DA AB'π '46 49 25 2A AA AA AD 4E AB FB DD 6B 77 57 92 4C'π '92 4A 52 44 A4 6A 9D AB 57 2D DB FF A5 2B 15 6D'π 'FB FF D7 7B 6D AB 55 54 98 92 48 A5 55 55 52 B1'π '55 6F BB 96 A9 AA 24 91 24 94 94 91 12 83 65 6D'π '5A F6 BF B5 54 D4 AA DB DF BA BD EE DB 54 B5 55'π '22 24 92 5A AA AA AD 4E AA DE FE 6D 57 75 49 4A'π '49 21 21 26 49 5C 9A 9A B5 4B FB 7F D5 29 55 77'π 'B6 F7 F7 55 B6 AB 55 54 94 89 34 A5 55 55 69 B2'π 'AA BD EB AA DA CD 92 24 92 4A 4A 48 A4 13 6B 75'π '6A BD 77 FF AA A2 2A DD 7F EE EE FF 69 56 AA A9'π '21 12 41 49 5A AA 96 4D 6B FB BE D5 B5 BB 24 91'π '24 92 92 92 49 6D 4A AA D5 D7 DF EB 54 4A D5 B7'π 'EE BD DD AA D6 AC D5 52 4A 24 95 56 A5 55 69 B5'π '56 F7 FD AD 2B 52 89 26 49 24 24 45 12 82 B5 55'π 'AB 34 BD DF EA 95 29 6F 7D F7 B5 7B A9 B3 5A A4'π '90 49 22 A9 5A AA 96 AA AD DF 6B 52 ED EE 12 48'π '92 49 51 2A 49 2D 4D 6B 56 EF F7 FF 95 35 56 BD'π 'EF BE EF D6 B7 4E A5 49 24 92 4D 56 A5 55 6D 55'π '53 BE FE AD 55 19 24 92 24 92 4A 88 92 52 B5 96'π 'AD 5A BD AF 68 44 A9 5B DE F5 B9 6D AA B4 DA 92'π '49 24 92 A9 5A AA A9 6A EF 75 ED 69 AA F7 49 24'π 'C9 24 92 52 34 85 4A 6D 5A B5 F7 FE AE B3 56 BF'π '7D EF 6F BB 55 6B 29 24 92 49 25 46 AA B5 56 95'π '16 FF DD 96 B5 94 94 49 12 49 24 94 C1 2A B5 DA'π 'B5 E7 6F BF D1 4C A9 76 FB BD DA ED 5A 94 D2 49'π '48 92 4A A9 55 4B 69 6A ED D6 FB 75 4B 6B 22 92'π '44 92 49 21 15 45 56 2B 6B 5D FE F6 AE 91 56 CF'π 'EF FB 77 B6 B5 6B 24 92 22 26 95 56 AA B4 96 D5'π '5B 7F DE AA B6 9E 54 24 99 24 92 4A A4 9A A9 D4'π 'D6 B7 6D FF D5 57 54 BE DF 56 AD 6D 6A D4 D9 24'π '89 48 2A AA AA AB 6A A5 D7 FD B5 55 55 71 02 C9'π '22 49 A4 92 49 29 56 5B AC ED DF B7 AA A8 2B 5D'π 'FA FD FB D9 AD AB 22 49 22 25 54 A5 55 55 55 5E'π '1E EB FD AA AA AE 54 12 48 92 12 24 92 42 A9 B5'π '5B 9B 7B 7F 55 55 D4 AB DF EB AE B7 52 56 49 2A'π '4C 92 AB 5A AA AA AA A1 F5 DF EB 77 55 55 89 44'π '9B 24 A4 C9 24 95 56 A6 B5 76 B7 F6 BA AA 13 5F'π 'BB 5F 75 EA AD A8 92 40 91 24 54 A5 55 55 55 5E'π '5F FF 5E A8 AD 6A 22 5A 20 49 89 12 49 24 AA D9'π '4A DD FE EF E6 D5 6C AB 7F F6 DF 55 5A 55 24 95'π '24 49 4B 5A AA AA A5 A1 AB BA F2 D7 55 AA 48 81'π '4A 92 34 A4 92 49 55 2E F5 B7 6F DF D9 AA 93 3F'π 'F5 5D B6 EB 55 D4 49 24 49 55 54 A5 55 55 5A 5E'π '7F 77 DF 29 5A 55 11 2A 52 24 82 49 24 92 AA D1'π '97 6D DD FE B7 55 24 C7 6F FB 6C 96 AA 29 A2 49'π '92 84 95 4A AA AA A5 A1 D6 EF 7A F6 A5 AA A6 44'π '84 A9 28 92 49 25 55 2F 6C DB 7B AF EA AA AB 3E'π 'FF D6 DB ED 55 C4 14 94 24 29 55 55 55 2B 5B 5F'π '7F FD F5 95 5A B5 08 99 2A 42 4B 24 92 49 2A D9'π '57 B6 DF 7E DD 55 54 4B DA BD B6 AA B2 29 41 22'π '89 4A AA AA AA D4 AA A2 D5 DB EF 6A B5 4A 52 22'π '49 16 90 49 24 92 55 36 DC ED BB FD B2 B5 52 B7'π 'FF AB 6D 5B 44 8A 2B 48 B2 55 55 55 55 2B 55 5D'π 'BF BF BA AA A5 B5 85 54 92 50 2A 92 49 24 8A D5'π 'AB 96 F6 D7 EE A6 94 8B B5 76 B5 A4 A9 50 C8 12'π '84 AA AA AA AA D6 AA A5 7B 77 76 D6 DB 4A 28 49'π '24 A5 52 48 92 49 29 2A 55 7B AF FF B9 59 62 27'π '7F DD DD 5B 51 05 12 A4 A9 53 55 55 55 2C B5 5B'π 'F7 FE DD AD 2A B5 42 92 49 09 24 93 24 92 52 EB'π 'AD AD 7D BF 76 B6 9D 4A ED 77 76 B5 56 48 45 29'π '22 AC AA A5 5A D3 4A B6 EE D7 FB 5A D5 4A 2D 24'π '92 52 49 24 69 45 25 2C B7 6B D7 F7 E9 D5 62 BB'π 'DF ED A9 AA A0 92 98 4A 55 53 55 5A A5 2C B5 AB'π 'DB FE B6 D5 5A B5 40 49 24 94 A2 49 02 2A 5A DB'π '6C DD 7F 6E DF 2A 9D 45 FD 5B 77 55 55 24 A2 94'π 'AA 96 B6 A5 5A D3 56 AF 7F B7 FD 35 65 4B 95 92'π '49 21 0C 92 AC C0 42 A5 AB B7 DD FF FA DD 61 2B'π 'BB F6 4C AA A4 49 14 A5 55 6D 49 55 55 2D 69 5A'π 'F6 FE FB EA 9A B6 24 24 92 4A 51 24 21 15 95 5D'π '5E ED 7B BF B7 32 8A 4B 77 EB FB 5A A9 22 49 1A'π '25 AA B6 AA AA DA 96 B7 EF B7 D6 95 65 69 49 49'π '22 42 19 25 59 80 85 4B 57 6F BB FF F5 BA C2 57'π '77 EC 99 55 48 92 29 4A AA DA 92 AA AA 5A D2 B5'π 'ED FD F7 D5 35 6C 92 92 4C 94 A2 48 42 2B 2A BA'π 'BD DA F7 7F 6E 65 14 96 EF D7 F6 B5 52 44 92 34'π '4B 55 6D 55 55 B5 2D 6F DF 6F AD 2A CA D3 24 49'π '21 25 88 92 94 88 45 56 D3 37 AF ED D9 DA 65 2D'π 'BE BD 4A AA A5 29 44 AA B4 AA A9 55 6A AA D5 BD'π 'BB FB 7A D5 B5 AE 49 12 4A 48 33 44 A1 32 AA A9'π '5E ED 7E DF F6 AA 88 57 7D D2 B5 55 48 42 29 48'π '4B 55 56 AA 95 55 55 5B F6 DF F7 AB 4B 51 92 A4'π '94 92 84 15 16 45 0A B7 B5 BB DD FF 6B 55 25 4D'π 'DB FF D6 EA 92 98 8A 35 B6 AA A9 55 6A AA AB 77'π 'BF F6 ED 56 B6 AE 24 49 21 24 52 A8 48 88 4A AA'π '6B 57 7B BE DD B5 52 97 36 AA 29 15 24 A2 11 6A'π '55 55 56 AA AA AA D6 DF 6D BF DA A9 55 55 49 12'π '4A 49 88 92 A2 32 95 6D D6 BE D7 7D F6 CA 88 2A'π 'DF FD D6 EA 51 09 2E D5 AA AA A9 55 55 55 2D BE'π 'FB EE F3 56 AA A9 92 54 90 92 33 24 94 C4 A5 4A'π 'AD ED BF F7 AD BE B3 4B BB F7 4D 14 A6 54 52 AA'π '55 55 56 AA AA AA D5 75 DF 7D DE AD 6A B6 24 C2'π '23 24 84 49 25 11 0A BB 5B 5B 76 EF FB 51 44 55'π '6E AC BA F5 08 91 0D 55 AA AA A9 55 55 55 AB EF'π 'B7 DF B5 6A DB 49 49 19 6C 49 29 12 48 56 6A D5'π '76 D7 ED BE AD EE A9 0A BF FB 55 0A 52 24 AA AB'π '55 55 56 AA AA AD 5D 5E FE FA F6 D5 24 B7 92 42'π '01 12 52 64 92 80 85 AA CD BE 5F FF FB 55 52 AB'π '5B F5 AA F4 A4 D1 35 56 AA AA A9 45 53 5A AB FB'π 'ED B7 ED AA DB 6A 34 94 D2 66 A4 89 24 B5 2A AD'π 'BB 6D FB 6D D6 DD A8 24 B7 6E 55 09 09 0A 4A B5'π '55 55 57 5A AC 55 55 B7 BF FF DA 55 55 55 41 29'π '14 88 49 52 49 04 4B 5B 56 DB 56 FF BD B2 43 4B'π '6E F9 AA F4 52 A0 B5 6A AA AA A8 A5 53 A9 6F 6F'π '7B 6E B5 D6 AA AB 2B 52 45 22 92 24 92 49 54 B5'π '6D B5 FD DB 6B 6D B4 2A AB EE B5 09 94 2A 5B 55'π '55 55 57 4A AC 56 DA FD F7 FD E6 99 55 54 44 24'π 'A8 4D 24 8A 44 B2 8B 6A BB 5F 57 BF FE DB 4A D5'π '57 F9 4A F2 21 44 B6 AB 6A AA A9 55 53 AA 97 DF'π 'EF 6F BD 66 AA B7 99 49 12 D0 49 50 99 04 2A AB'π '56 EA FE FE A9 76 A9 2A AD D6 B5 04 96 91 49 5A'π '95 55 56 AA A4 55 7D BB 5E FD EA 9A D5 68 A2 92'π '42 05 92 25 22 49 55 56 F5 BF AD F5 FF AD 5A 95'π '53 79 55 69 48 24 BF 65 6A AA A9 25 4B 2A AB F7'π 'FB D7 9A B5 2D 4F 4C 24 AC AC 24 8A 48 B2 4B 6D'π '2F 55 7B DF AA F9 A5 6A 6E F6 D5 8A 22 89 4A DA'π 'AA AA 96 C8 98 55 6E BE DF 7F 75 6A D2 B1 91 49'π '11 21 49 50 92 84 96 AA EA FF AE BA FE B7 5A 95'π '93 E9 2A 30 94 B2 B6 AB 55 55 69 13 65 AA DB ED'π 'F5 FD DA D5 5D 6E 2A 22 42 4A 92 26 A5 29 29 5B'π '5D AA FB F7 AB ED B5 6A 6D 36 D1 45 49 05 4D D6'π 'AA AA 95 74 94 15 6F FF DF D7 B5 AA A2 D2 A8 CC'π 'AC 94 24 88 08 42 56 AA B7 7F AE BD 7E DB 6A AA'π 'D6 E9 2A 91 22 52 BB 6D 55 54 AA 81 21 4A BF 5B'π 'B7 BF 6B 56 DD AD 55 11 09 21 49 25 52 95 4A BB'π '6D DB 7D FB AD B6 DB 55 9D 55 55 26 4C 95 56 BA'π 'BA AB 54 AA 4A 5A EA FF 7E FA DC A9 25 55 2A 4A'π '52 4A 24 48 94 A2 5D 65 5B 76 AB 76 FB 5D B4 AA'π '6A 94 AA A8 91 22 AC D5 65 54 A9 48 92 A5 BF FB'π 'ED EF A3 56 DB 5B 54 A4 A4 98 C9 B3 21 14 AA DA'π 'F6 ED FD ED 96 FB 6B 55 DA 23 2A 45 24 55 53 B6'π 'DA A9 56 93 24 4D 77 D7 5F DF BE B5 55 64 AA 91'π '09 23 12 04 5A 49 52 AB 4D 97 57 7B 7D B6 DE AA'π '54 89 55 12 49 85 5D 6D AB 55 29 48 51 5A EE BE'π 'FD BA 65 4A AA 9B 49 4A 52 48 44 AA 80 A2 5D 56'π 'BB 7D FD F6 D7 6D B5 55 95 22 14 A8 92 2A E7 5B'π '6C AA 55 25 26 85 DD FB AB F7 DA B5 55 76 92 24'π '92 92 99 49 2B 49 A2 DA D6 D7 56 ED BD D7 6D AA'π '74 45 CA 93 25 57 1A EE AB 55 42 4A 48 3A BF D7'π 'FF BE B5 55 69 A5 24 91 24 25 23 32 48 12 5D AB'π '5D BD FB D9 6A BE DB 55 89 08 15 44 48 28 EF 59'π '5A A8 AC 94 D2 CB FB BE AF 75 EA AA 97 5A 49 24'π '49 4C 94 84 92 E5 A5 5A B7 57 FF FF DF FF FE FF'π 'FE 52 FE BD 12 D7 FF D7 B5 55 D1 21 E5 35 77 FF'π 'FA EF 55 55 6D 53 12 49 B2 51 29 29 64 FA 5A B7'π 'EC FD 7F FF EF FF FD FF FF 87 FF 9A 65 5F FF FA'π '6A AB E4 4A F2 CB FF FF DF BA EA AA A9 6E 64 92'π '4C 84 A2 52 09 E1 66 C9 FB 97 EE B5 4E A6 CA C4'π '55 5F EA FC 0A BF ED 7D D5 55 A1 92 E1 36 EF 6B'π 'F6 EF AA AA D6 D2 09 26 91 2A 89 04 D4 EA 99 37'π 'D6 FD 5B D6 A5 DD B6 19 AA 3F 41 5A 95 7F 5A D7'π '6A 8B 82 25 D8 CB F5 D5 6D BA 55 55 2A AD 52 48'π '22 49 36 69 2B F9 66 CF A9 AB F6 FB 42 B7 6C 22'π '28 F8 14 98 95 7A B7 5A 95 33 D0 89 E0 35 FA BE'π 'DF FF EA AA D5 55 88 92 AC 92 40 92 C5 C4 59 BB'π 'B9 7F 6D D6 01 DA D0 08 90 FA A0 23 25 F5 60 35'π '6A 47 A1 53 98 CB 6F 01 F9 6A B6 AD 5A AA 32 A5'π '21 24 95 44 19 BA 27 57 54 D6 DB 2C 03 37 A0 3B'π '48 E0 00 18 52 F6 C0 2A D4 AF 08 87 E4 35 FC 00'π 'D8 FF E9 52 A6 B5 44 8C 4A 4D 24 29 A3 C4 58 AF'π '78 BD 6F F8 16 FD 40 4C 11 CA 80 BE A1 ED 00 D7'π '45 57 50 2B 98 57 F6 0F BC ED 56 AD 59 6B 91 32'π 'A4 90 89 4A 17 94 27 57 A4 55 BB A4 2D B3 40 9E'π 'D1 D0 01 59 59 DA 85 BC C4 86 94 4B 74 2B 6C 3B'π 'FA 5B E9 5A B6 D6 26 84 92 25 32 A0 A7 6A 18 DE'π 'DC 3A EF FC 3B 7E C5 2D 21 C2 0A 1E E5 B5 0B 7B'π '92 2F 20 97 4A 56 F8 37 D6 7E B6 D5 65 6A 48 29'π '21 4A 44 15 2F 95 27 BF 36 6F B7 68 6A F5 40 4E'π 'D3 A4 00 BD 1B CB 06 9D 60 DE 48 2F B4 2F EC 6F'π 'FE 2B EA AA DA 96 95 62 4A 59 11 45 57 AA 1A 2E'π 'EC 1A DF 54 4F BE 82 9D 23 88 12 3A E3 B6 14 FE'π '81 0C 92 27 5B 15 D8 7B AA 3E D5 55 26 F5 21 0C'π '91 02 66 AA 27 55 95 DF 5B 37 77 F4 7A 75 84 AE'π 'D3 50 04 5D 43 EC 17 AD 50 5D 24 4F 66 2F BC 5E'π 'DE 1D AA AA DA 8D 4A 51 22 68 88 48 9F 2A 0A 5E'π 'B6 3D DF EC 2D F2 45 1D 23 42 28 BA A3 4A 2A 6E'π 'A0 9C 4A 1E 9D 1B F6 FF F6 37 F5 55 55 7A 99 24'π '94 8B 25 93 4E D5 85 BD 6D 0F 77 B4 57 72 80 AE'π 'D3 94 01 3A C3 BC 2D DD 28 3A 99 0D 6D 0F 5F FA'π 'AC 3D 4A AA AB A5 22 49 21 20 52 24 5D 2F 4B 5D'π '5F 1E DF EC 7D 7D 05 5D 23 40 2A 5D A3 A2 16 AD'π '40 7C AC 1E D6 96 FD F7 FC 37 F5 6A AC 5B D4 92'π '4A 4D 09 52 9E 52 8D 7B B5 9D F7 58 2A F2 42 AE'π 'D3 94 00 BB 43 DE 1B 5C 90 B9 09 1D 25 8D F7 DD'π '58 6D 4A 95 7B EA 09 24 94 91 6A A5 3D B3 42 BE'π '67 0B DF 74 6D BC 85 5D B3 20 12 5E A3 34 34 BF'π '20 3A 4E 1A E7 4B DF FB 70 7B F5 6A C5 2B A2 49'π '21 24 11 2C 9A 63 45 7D C6 87 B7 A8 5B 71 04 DD'π '23 84 05 5A C3 EA 0B 6C 48 72 85 3D 43 4F BF 5F'π 'A0 EF 4A 95 BA D6 2C 92 4C 8D A6 A2 3D 91 A2 F5'π '23 CF 7F EC 36 B4 43 3E D3 28 10 5A A3 96 36 DE'π '90 F4 46 BA A2 83 7B EA 81 DA F5 6B 4B 6D 41 24'π '92 50 10 49 7A 61 62 FA E3 46 EF 58 6D 7A 84 CD'π '53 80 22 BF 43 6A 0C AC 40 6A 87 76 C3 66 F7 5C'π '03 BF D2 AC B6 92 14 49 21 25 65 52 B5 81 C1 7B'π '43 C5 BF 34 5A B0 83 3E A1 2A 04 BA C3 DA 3B 5E'π '88 F1 02 7B 43 C5 FD F0 0D 76 AD 5B AD 7D A5 92'π '4C 89 0A 45 72 61 B3 E6 83 A7 FF EC 35 35 04 6E'π 'D1 40 29 7D 23 94 14 DD 10 E4 87 B4 85 A3 6E A0'π '3B ED F2 A4 6A C2 28 24 91 32 52 AA 7D 81 C0 FD'π '45 C3 7F 58 5F FA 43 DD 21 88 02 DE E1 F6 2B BC'π '20 D5 0B 5B 03 A1 FB 80 7F BF 45 5B DB 3F 45 49'π '22 44 A4 45 72 42 F1 F2 83 F1 FF 94 77 F0 84 2E'π 'C1 92 15 B9 82 D5 2D 7A 41 D2 05 AA 85 F3 77 03'π 'FE FD F9 65 14 D2 A9 2A 4C 91 0A 94 F5 81 51 ED'π '05 B3 6D 7C 2F 25 23 DD 50 A0 13 5F 61 AD 1A BC'π '91 ED 0B 55 07 D1 FA 0E BC EB 42 9E FB AD 12 40'π '91 2A A9 53 F2 46 D1 D5 86 E1 FD D0 52 4A 54 3D'π 'A1 4A 04 BC 82 DA 13 79 21 92 15 B6 0A D1 EF 0D'π 'FA 3F F5 69 45 36 44 95 A2 A4 92 04 C5 85 ED AB'π '0B D8 DA DC 54 98 8B FD 40 00 4B FB 61 35 CD F4'π '43 AC 0B CD 07 F9 7B 9B EE 3D 49 56 BA E9 D9 24'π '16 49 24 B3 DD 01 7B DA 0E F9 FF B4 21 22 44 FA'π '90 AA BF D4 A2 EB 3F E1 3F D3 3F B9 8F D6 F7 7F'π 'DC 2B F2 DA D7 56 02 49 40 92 49 45 E2 87 73 D3'π '19 F8 B4 6C 4A 44 83 A5 A0 00 2F AB C1 56 FF 94'π '3F AD 1D 56 9F FE BE DE B6 3F D5 55 AA AD 54 92'π '5D 24 92 AB AD 0C BD AE 17 74 7F D8 52 89 44 5A'π '41 49 55 2C A1 6C 8A A2 39 52 9B 65 5E DB AD B5'π 'EA 2E AA B6 B5 52 92 44 81 49 29 27 D2 0B 5B B4'π '1D EC EE B4 24 32 83 B5 82 12 56 DB A2 DB 75 88'π '04 AD 45 9D 63 76 9B 7E BC 3D F5 4A D6 ED 24 92'π '52 52 45 4B A6 0A B5 54 2B 7C 7D AC 49 44 84 AA'π '00 80 2D 1D 21 A4 14 00 13 5A 82 AA C1 DD 8E EB'π '8A 2F CA B6 AA 95 49 24 95 08 94 A7 94 15 7A A8'π '16 FA 5B F8 52 50 83 40 00 2B 40 1A E1 5B 80 00'π '00 00 04 00 02 00 0B 80 00 3D B5 55 55 6A 92 49'π '20 B3 2A AF 4A 1B 5D 54 3B D6 7F 54 24 97 85 58'π '11 40 A8 1B 42 AD 50 01 58 00 02 00 01 00 06 A0'π '0E 3B 55 6A AB AB 24 92 4D 44 55 57 54 0A BD B4'π '6E BE 37 F5 49 50 2A B3 22 17 52 BE A1 D2 A4 92'π '44 B5 56 D5 DB 77 5D F7 5D EF EA 95 74 54 89 24'π '90 91 2A A7 4C 36 CF 50 5B FE 1F EA AA 25 52 AD'π '44 41 6E FD 62 2D AA 28 9B 4A AD AB 76 DD F7 BE'π 'FB BA B5 6A AB AB 32 49 23 2A 95 4E A0 0A BE A8'π '36 BD 3F B5 50 CA AA B2 10 8E 91 9A C1 D5 50 83'π '2A B5 59 56 AB BB AE F5 B7 EF EA D6 D4 6C 44 93'π '48 44 6A AF 5C 3D 5D 50 6D DB 17 EC A5 12 4A AD'π '45 11 6F FD A2 55 AA 58 55 55 A7 54 EE F7 7B EF'π 'EF 7D 95 A9 35 93 91 48 15 29 95 1D 40 52 FD 60'π 'DB 7E 9F B2 59 4C AA B2 10 2E D2 FD 41 B5 41 02'π 'AA AA 5A 6F BB AA D7 5B 5E DB 7B 56 DA 6D AA 92'π 'B2 4A 52 BE 58 2D 9D 90 B6 DD 97 EC 22 31 45 68'π '82 55 AD D3 A3 4B 54 55 55 55 AD D5 6D 7F BE F6'π 'FB F6 D4 AA A4 AA 52 A4 80 B2 AD 7D A0 53 7B 61'π '6D BF 0E 9A 09 46 AA 82 24 AA 56 EE 42 B6 81 12'π 'AA AA B2 A5 D7 D6 ED DF AF BD AB 55 59 55 A4 89'π '2D 45 52 BA 50 AE BC 90 B6 FD CB EC 14 A9 4A A5'π '48 55 A9 79 A1 55 2A 45 55 55 4D 5E BD 7D DF 7D'π 'FD 67 35 5A A5 55 89 32 49 15 95 FD AC 77 F3 6F'π 'DB FF 77 40 25 24 95 48 01 B6 B6 B6 A2 AA 40 9A'π 'AB 55 BB AB EB D7 7B F7 57 DC EE A5 5A 56 B2 44'π '92 6A 2B FA 5C CF FD 5F 6F FE D5 D0 0C 92 46 91'π '52 54 D5 69 41 55 15 25 54 AA 55 56 DF 7D D6 AD'π 'FD 77 51 5A A5 29 45 11 24 95 55 D5 A2 2E DA AA'π 'B7 ED B5 22 52 49 19 22 05 AB 2A 96 A2 A8 40 4A'π 'AB 55 AA AD B6 CA BD FB D7 AD AE B5 5A 56 B4 B5'π '4A 22 AA AA 5D 0B 55 5D DC BB 6C DC 89 24 66 88'π '51 54 D5 69 A2 A5 14 95 54 AA 55 5B 6D BF F7 AF'π 'BE FA B2 AA AA AA 49 02 11 4C 49 24 A5 16 AA EB'π '0B D6 D8 21 B4 92 8A 50 85 55 AA 96 41 48 41 2A'π 'AB 55 B5 56 DB 55 5D FF 7B AB 6E D5 76 95 B2 58'π 'AC 51 12 40 00 0A 80 00 0E 80 00 6A 01 24 54 82'π '2B 6B 55 69 A2 92 8A 55 55 5A 6D BD B6 FF F7 BA'π 'EF 76 D5 2A 8A AA 04 A5 21 8A A4 90 00 15 00 00'π '05 E0 00 14 AA 4A 96 B4 0A 96 AA 96 42 A4 10 AA'π 'AA A5 D3 6B 5D D5 BE F7 DE DD 2A D5 75 45 69 09'π '4A 24 2D 65 AB 6E D5 AF AF 5E D4 69 48 AA A9 80'π '55 6D 55 6D A2 A9 25 56 AD 5A AE DA F7 BF 7B DF'π 'FD B2 F5 2A 96 AB 92 56 11 49 D2 14 55 49 2B 7D'π '7A E9 A9 54 95 55 56 68 96 D2 AA AA 52 42 49 29'π '52 AB 35 B7 AD 6D F7 7D 5B 6D 96 D5 6A D4 24 90'π 'A2 5A 15 C5 AA B6 EC DB EF BF 2A 2B 22 AA AD 81'π '2D 2D 55 55 AD 28 92 56 AD 54 EB 6D 7B DB EF FB'π 'F5 B5 69 2A D5 93 49 25 2C 81 64 2A AA B5 53 BE'π 'BD 6A D8 AC AC 55 4A 2A 5A EA AA AA 52 42 24 A9'π 'D2 AB AE DB AE BF BE EF DF 6B 56 D6 96 6C 24 4A'π '41 2A 95 45 55 BA AE F7 FB DB 65 13 51 AA BA 80'π '25 55 55 55 AC 94 89 56 2E AD 35 B6 FB F5 6D DE'π 'BA D6 AA AD 69 DB 49 98 92 52 2A 95 56 C5 55 BE'π 'F6 B6 94 2C AA 6B 52 28 DA AA B2 AA 51 21 24 A9'π 'D1 5A ED 6D B6 AF FF BB F7 9A D5 2A 96 52 92 23'π '24 84 C0 35 6D 3A EB 6D AD ED 61 5B 55 AC AD 41'π '2A D5 4D 55 A4 94 49 56 AE EB 5B DB 6D FD DA FE'π 'AD 75 36 D5 6D EE 34 88 49 2A 2B 42 92 C5 96 FF'π 'FB 5A 8A 14 AA 53 54 0A 55 AA B1 56 4A 42 92 D5'π '51 9A B6 B6 DB BB 7F D7 FB 4A C9 5A A9 55 41 35'π '13 48 94 95 6E BB 6D DA B6 B6 B5 2B 55 AC B5 50'π 'AB 55 46 AC 91 28 25 2A AF 66 ED ED 77 77 D7 7D'π 'AE B5 B6 A5 57 DA 96 41 60 15 52 25 51 56 9B BF'π 'ED ED 44 14 EA 53 54 04 5A AA A9 59 24 82 92 D5'π '52 5D 5B 5B DE EE FE FF 79 6B 4D 5A AA B3 50 AA'π '0D 69 24 94 AE A5 76 FB BB 5A 39 57 95 AC AA A8'π 'ED 55 4A A2 4A 24 45 2D 2D A9 D6 D6 BB DD DD EB'π 'D7 56 B2 A5 55 AE A5 09 51 02 49 63 D2 DA AD EF'π '6A D5 82 09 6A 53 58 01 93 6A 92 A8 91 49 1A DA'π 'F5 57 3D BD F7 7F B7 DF 74 AD 4D 5A D7 75 54 52'π '42 55 2A 08 2D 35 5B BE DF BA 34 9E 95 AC D1 29'π '6D 52 A4 93 4A 22 A5 55 2A BA E7 6B 6E F5 FF BE'π 'CB 72 B5 65 2D DB 69 A4 94 92 48 D5 D2 CA B6 FB'π 'B5 65 4A 23 7A B3 2A 42 9A A5 0A A4 24 8A 4A AA'π 'D3 55 BE DE DD EF DD 7B B6 CD 4A 8A DB 2E 94 09'π '29 24 93 22 2D B5 6B F7 6B 5A A8 8C A5 4C E0 89'π '6A AA B2 12 D1 24 95 55 6E D7 6D B5 BB DF BB F6'π 'CD 32 B5 6B 56 F5 6A B2 42 49 24 4A D5 4A DF AE'π 'DE E5 55 13 5A B3 0A 12 D5 A4 84 A4 04 51 2D 56'π '95 3A DB 6E EF BD 77 EF BA ED 4A 94 AD AD 55 44'π '90 92 4A 91 2A B5 B7 7D B5 9B 28 2A EB 4D 60 4D'π 'AA 29 29 29 AA 8A 52 D9 6A D7 56 DB BB 7B EF 5B'π '55 53 5A AB 57 5B AA 91 2D 44 92 56 D5 4D 2E FB'π '6F 75 55 45 54 B5 04 91 55 D2 52 42 20 22 AD 26'π 'D5 6C FD B6 EE F7 FE FE AA AC A5 56 BC F6 AA A6'π '41 29 4A A1 2A B2 F5 EF 5A AA 2A 12 AB 6A 49 2E'π 'AA 24 84 94 8A 95 52 DA AD 9B 97 6D BB EF 5D EB'π '55 D3 52 55 6B AD 55 48 92 4A 24 4A AA AD 9F DA'π 'F5 D4 D4 A5 D6 94 90 51 55 49 29 25 21 2A AD B5'π '53 76 FA D7 6F DE FB BE AB 2C 95 AA AD 6B BB 55'π '24 90 C9 52 55 73 7B BF 5F 2B 2A 0A 2D 75 22 AE'π 'A4 92 4A 48 4C 55 55 26 AE AD AF BD DE BD EF 6D'π '56 D3 2B 56 DB 5D 64 B2 49 25 12 45 AA 8E B7 7A'π 'EA D8 A8 A1 DA 94 84 51 49 24 90 92 A2 AA DA DA'π 'B5 5B 75 6B 7D FB BD FA AD 2C AA AD B6 EB DB 4D'π '52 49 65 2A 55 68 EF F7 BB 52 2A 0A B5 6A 49 AA'π '95 49 25 24 09 55 25 B5 6A F6 AE DD D7 F7 F7 D5'π '5A D2 55 55 6D B6 A6 B5 40 92 08 49 AA B7 5D 6D'π '6E A4 D4 91 4A A9 10 55 21 24 49 49 56 AA DA 4A'π 'AB 4D 7B B7 7F 5F 5F BA B5 55 AD 6D B7 6D 5D 4A'π 'AD 24 A3 4A 95 59 6B FF DA A9 29 24 B5 54 41 15'π '4A 49 92 22 4D 55 15 B5 5D 7B D6 ED FE FA FA E5'π '55 94 52 9B 6C CB B2 BD 4A 49 4C 15 2A A6 BF ED'π '6D 92 55 49 55 52 92 69 14 92 24 88 BA AA EA AB'π '6A AD 7D BB ED EF EF D5 6A 2B AD F6 DB BE 6D 52'π 'B0 D2 11 69 55 59 EF 5F DA 24 A8 12 AA D4 40 96'π 'B1 24 89 22 A5 55 15 54 D5 EB D7 57 5B BF BF AA'π '95 54 6A 9D B6 D5 D5 AD 4E 08 A5 04 AA B6 9A FD'π '74 C9 5A A4 57 55 12 2A 46 49 34 89 5A AA AA AB'π 'AB 3E BA FE FF FD 7A A5 6A AB D5 73 6D 6A 56 B3'π 'B0 A5 88 51 55 45 77 FB A9 12 A4 91 2C A8 40 54'π '90 92 42 23 6B 55 55 55 36 E5 EF AD F7 6B F7 AA'π 'D5 54 95 AE B5 DD AA AE 4D 52 35 A6 AA BA DF D6'π 'F2 44 B9 24 AB 52 88 95 25 24 94 8A 54 AD 35 6A'π 'EB 5F 55 7B AE FF DF 55 AA 5B 6E B5 DB 2A 5D 69'π 'B2 08 82 09 45 4A AA BF A4 99 44 A9 15 54 11 55'π '4C 49 29 25 AB 52 CA 97 56 EA FF D7 7F EE BC AB'π '55 A5 55 6F 6D F5 6A D6 6D 55 28 B5 2A B5 BF FE'π 'D1 22 B9 42 4E A1 20 08 91 92 42 4A 76 AD 35 6A'π 'AD BF 55 BE DD DD FB AA AA 5A AD DA B7 4A D5 AD'π 'D2 A1 4A 82 55 4B 57 F5 64 49 52 94 95 5A 42 53'π '24 24 94 95 C9 55 4A DA D7 6D FF 6D BB BF EE B5'π '55 2A DA B6 EC B5 5B 5A AA 8A 11 2C AA B4 BE AF'π 'A8 92 A9 29 2A A0 84 94 49 49 2A 2A B6 AA B6 A3'π '5C DB 55 DA FF 7B BD 4A AA 56 B5 AD AB D6 AA 55'π '55 54 AA 41 55 4B 6D FE C1 25 72 52 65 4A 28 21'π '12 22 61 5B 4D 55 49 5E B3 B5 FE B7 DB F7 7A B5'π '54 A9 4B 76 DD 54 B5 B5 DB 51 25 1A AA 96 DB F5'π '92 4A AA A4 8A D0 80 8A 66 CD 0A 26 BA AA 36 A9'π '6E DF 5B ED B6 EE D5 4A A9 56 B6 CD B6 A9 CA 66'π '24 A6 48 A1 55 65 37 AF 24 12 D2 99 55 45 11 12'π '88 10 54 DA D5 6A C9 56 D5 72 F6 BB 6F DF F5 B6'π 'AA 35 6D BB 69 AA 35 DD DB 50 92 16 A4 9A EF 7A'π '88 A5 29 22 15 10 22 24 52 A5 A1 2A AA A5 2A AB'π '5B DF AD D6 BD 7A AE A9 54 CA DB 6E DF 54 D6 AA'π 'AD 55 25 69 5B 65 5A EF 21 0A F2 48 AA 45 40 49'π '24 94 0A DB 55 4D 55 54 B6 B5 7B 6B EB F7 D5 56'π 'B1 35 B6 D5 B4 A9 6D 55 52 AA 48 02 44 9A B7 DA'π '4A 25 44 93 2A 88 05 12 89 21 55 B5 5B 5A AA AB'π '6D EF AE BE BF EF 7A E9 46 4E ED BD 6B 52 AA DA'π 'BB 54 92 D4 95 45 6D B6 A0 4A B1 24 56 11 10 24'π '52 4A 49 56 E4 B5 55 AD DB BA FD D3 EA DE CB 16'π 'B8 B5 9B 6B D5 54 55 35 D6 BB 25 2A AA B5 5B 6C'π '89 11 46 4A EC A2 24 AA 94 94 96 A9 1B AA AA 5A'π 'B7 6F AB 7E BF BD B6 E9 42 4B 76 D6 AE A1 6A E6'π 'AD 64 CA D5 55 35 77 DB 22 45 A8 B5 15 04 41 00'π '42 21 29 B7 F5 55 55 D5 AE D5 7E AB F6 EB 6D 56'π '94 BE DB 7D B5 4A 55 9D 52 DB 35 2A AA AA AD 74'π '88 0A D5 4A EC 50 88 2A 98 CA 57 6A 46 AA AA 57'π '7D BF D5 F6 AD 7E D2 A9 A5 55 B6 CA 6A A2 D5 69'π 'BD A6 D6 D5 55 55 7F DA 21 51 42 B5 1A 02 11 42'π '23 12 AA AD BD 5B 55 AA DB 55 7F 5D DB EB AF 56'π '48 AB 6D BB D5 2C 2B 57 57 5D A8 95 4A A5 AB 74'π '8A 05 D5 4A F4 A4 42 14 C8 45 55 52 C9 A4 B5 5E'π 'B6 FF D5 F7 76 BE B5 69 92 BE DB 56 AA C2 D6 DA'π 'B4 6A 37 6A B5 5A 5F A9 20 AA A2 B5 28 08 84 22'π '15 9A B6 EF 36 5B 4A A9 ED 55 BE AA DD EB 6A 96'π '25 6B B6 F5 55 15 6D 55 63 D5 E9 55 4A A5 B6 F4'π '4A 01 C9 56 D2 A1 10 48 A4 25 4D 54 D5 B6 BB 57'π '5B FF 75 EF B7 BE CD 69 4A DA 6D AD AA AA 92 AA'π 'DD 2B 56 AA B5 55 4F D1 10 AB B4 A9 54 04 24 8B'π '49 5A BA AB 6D 65 44 AA EE AA EF 5A ED 75 B5 96'π '15 B7 DB 55 55 55 6D 5D A2 D6 AA D5 4A AA B6 A4'π '4A 01 41 56 A9 48 81 10 13 25 55 DD 92 9A BB 6F'π 'BB FF DA EF B7 E6 56 68 AB 6D 76 5A AA 85 D5 63'π '5D 6D 55 5A B6 A5 2D EA A0 AA D5 29 42 11 14 25'π '54 5A AA AA 6D 6A CA A9 6E B5 B5 BB 5D 5D D9 95'π '12 DB 4D EB 55 5A AA DE 6D A9 BA A5 6A D2 CB 58'π '0A 01 AB 56 99 42 21 49 2A A6 B3 55 D5 AB 35 5F'π 'DD EF 5F 6E F7 EA 97 6A 2D B5 FA 54 AA A5 56 A9'π 'D3 57 55 DA D5 2D 35 E2 A0 AA C4 A9 64 08 44 12'π '52 59 4E D6 9B 4C D6 B2 BA BA F5 DD 6E B5 74 A8'π '53 6F 2B AA AA 95 AD 56 95 6C B6 AA AA D2 D7 54'π '0A 01 AB 64 D1 51 09 45 14 A6 B5 2D 6A BB A9 6F'π 'F7 D7 AF 7B DD 55 AB 22 AE DA EC D5 55 AA B2 D9'π '7A D3 65 55 56 AD 2A D1 50 96 CA 49 8A 02 50 08'π 'A5 59 6A D9 55 54 56 DB AD 7A FA D5 7B EE 56 D4'π '55 B5 AB 29 6A 56 4D 37 A5 AD 5D 5B A9 4A D5 AA'π '02 21 95 92 20 54 02 B2 2A A7 55 56 D5 AB AA B7'π '7B EF AF BF EE B5 D5 21 2B 6F 55 D2 95 AD B2 C9'π '5A 56 D2 EA 76 B5 56 58 54 85 6A 49 44 81 54 84'π 'AA 58 AA B5 AA B5 6D DE FF DD 7B 6A DD AA 2A 4A'π '56 DA AE 29 6A A9 6D B7 6D E9 6D 55 8D CA A9 A2'π '80 09 97 22 29 2A 00 29 55 A7 56 CA 57 4A 9B 6D'π 'EE BB D6 BF BB 6D DA 91 5B AD 59 D3 5B 56 93 5A'π '52 96 9B DB 79 3D 56 A8 29 52 E8 56 82 40 A9 55'π '2A 5A B5 35 AC BB 76 BB DD EF 7E F5 76 AA 35 24'π 'B6 FB B6 04 A4 AA 6C A5 DF 6D 6A 2A A6 D2 AD 52'π '82 05 AA 80 28 A9 02 28 55 A4 AA EA DB 56 AD D7'π 'BB BE AD AF ED 5B EA 4D 2D 95 54 AB 5B 55 53 5A'π '95 6D DB 4D 5B 57 9A AA 22 0A D2 24 A0 81 48 57'π '95 2D 4A D6 9B 57 76 DF F7 BB 5F 7F B6 EA 55 24'π '15 A9 32 65 35 5A AE B7 76 D6 AD B9 6A A8 65 51'π '44 51 54 89 0A 14 12 AC 32 AA B5 A9 75 6C AD BB'π '6F 7F FA D5 6D 55 B4 49 FF 76 C4 8A C9 A5 51 64'π 'AA A9 53 66 D6 D7 DE A4 08 84 E5 20 21 21 44 5B'π '4A 52 AB 56 AA AB DB 57 FE EB 6F BF DA AB 4A AA'π '2A AD 29 55 37 5A AE 9B 55 56 AE 99 95 2A 29 4A'π 'A1 11 C8 05 44 4A 11 6E A5 AD 4A AD 52 DA 36 FE'π 'ED DF FA EC B5 D6 B5 11 D6 EA E2 4A EA AB D1 6A'π 'AD AA D9 77 7A F5 D6 91 04 22 B5 50 2A 90 A4 DA'π '9A 12 B5 59 6F A7 ED B7 DF BF 57 5B DB 2D 48 44'π '3D 95 0C 95 15 54 2F 56 DA 56 A6 AA A7 46 3A A4'π '48 85 C0 04 80 25 09 B5 42 ED 4B 56 D4 5D 5B 6D'π 'BA FA FD FE B6 DA B5 A9 EB 6A A1 2A EA AB D2 D5'π '55 AD 5D D5 5A BD E5 49 11 10 AA A1 52 88 53 6B'π 'A9 12 B5 69 AB B6 B2 DF FF F7 DF 55 ED 35 64 0A'π 'B6 AD 14 95 55 56 AC 9A AA 5A AA AB 6A CA 5A 92'π '42 23 C0 04 04 22 84 D6 44 AD 4B 57 5D 6B AF 7B'π '77 AF 7A FD 5A EA 89 51 6D 59 65 2A 95 54 53 65'π '55 F5 55 5C D6 B5 AE A4 94 44 95 09 51 48 2B AD'π 'AA 92 B6 AA 6B 4D 75 B7 EE FE F7 57 B3 55 72 4A'π 'CA B2 08 55 6A EB AE DA DB 0A BB 6B AD D6 D1 49'π '40 89 C0 22 02 22 84 B5 49 2D 55 55 D4 76 AE EE'π 'DD BD ED FA EE AA 84 91 BB 64 A2 AA AD 16 51 25'π 'A4 F5 64 D5 59 2D 3E 93 15 11 0A 48 A4 84 1B DB'π '52 52 AA AE 97 DD D9 BF FF EB BF 6F 54 D4 AA 4B'π '54 C9 4C 95 52 ED 6E DB 5B 2A DB AA B6 DA E2 A4'π '40 22 D0 02 09 29 26 2A A4 8D 56 D9 6C B3 6F 7D'π 'BB 7F 75 DA DB 55 A1 2A AB 92 11 35 6D 12 92 AA'π 'A6 D5 95 56 A9 B5 9D 49 2A 85 02 50 52 42 49 D6'π 'A9 32 55 56 DB 6E B5 EB F7 DB EF 77 AA AA 0A 4A'π 'AD 24 A4 C2 92 ED 6D 55 5A AB 6A B9 D7 56 6A 92'π '80 10 A4 02 85 14 96 BA D2 4D AA A9 A5 55 DB 5F'π 'BE FF 7A DD 55 49 52 9D 5A 49 4A 15 6D 12 55 AA'π 'B5 5A AD 67 3A AD D5 54 54 45 08 A4 10 22 2D 55'π 'A8 B2 5B 57 5E EE AE FF 77 AA EF B6 AA B2 54 35'π '54 92 24 AA 92 AD AA 56 A5 55 52 DA D5 6A 9A A2'π '80 90 52 00 A5 48 91 AA A5 8D A4 AD 69 5B 7B B5'π 'ED FF DA ED D5 44 81 6A A9 24 89 55 6D 5A D5 A9'π '5A AA AD 55 B5 95 75 49 29 02 80 02 08 15 2F 6A'π 'A8 22 5B 5A 96 AC D2 EF BF AD B7 BA 8A A9 2A AD'π '52 49 52 95 55 53 2A 56 A5 75 55 B6 AB 7D A5 54'π '42 28 14 54 51 20 52 95 B5 5D B6 B5 7B 77 AF BF'π '7B 7B 6D 6B 55 22 49 5A AC 92 14 2B AA AC D5 A9'π '5A 8A AA 55 6A A3 5A 92 88 41 20 80 82 4A AD 6B'π '61 25 25 65 94 AD 5B 7A F7 EF FF DE AA 89 12 B5'π '51 24 A2 D4 55 53 55 57 6B 75 55 EA D7 5E A6 A4'π '52 92 40 01 14 92 55 56 BA 5A DA 9B 6B DB B6 F7'π 'EF 7A BA B5 55 24 69 55 24 49 49 2B AA A6 AA A8'π '94 AA AD 17 AC B5 59 49 80 00 85 14 21 24 AA AD'π '6A AA AB 76 AD 36 6D EF DE EF F7 ED 52 49 82 BB'π '59 93 12 54 AA AD 55 57 6B 55 5A EC 5B 6A B7 54'π '55 55 08 20 8A 49 55 69 54 55 56 A5 5A ED DB DE'π 'BB DE AE DA AC 94 2A A4 42 24 66 AB 55 5A AB 59'π '54 A5 55 5B B4 DD 69 51 00 00 10 81 10 92 AA D6'π 'ED 6A AD 5D 75 9B 6F BD FF 75 FD AA A1 21 49 7A'π '95 49 09 6A AD 55 54 A6 AB 5A AA A5 6B AA D6 AA'π '52 52 21 04 25 25 55 A9 99 15 B2 EA C6 76 DB 7B'π 'EA FF 5B 5A AA 8A 92 A5 28 12 AA 95 52 AA D7 5A'π 'D4 B5 55 5E B5 55 A9 54 C4 84 84 09 49 4A AB 57'π '6E 6A 6D 95 BD DD B6 EF 5F ED F6 F5 58 22 25 5A'π '42 B5 55 76 AD 55 A8 B5 2B 6A AA E9 EE B5 57 55'π '11 20 20 10 12 15 56 AA BA 95 D6 6B 52 53 6B FB'π 'FD DB 5D AA C2 8C 8A EA 99 4A A5 89 55 5A 57 6A'π 'D5 55 55 57 5A AB 59 54 44 45 01 25 44 AA AD 6D'π '55 76 99 DE AD BE DD DF 6B 7F F7 6D 14 51 35 50'π '42 B5 5A 76 AA A5 A9 55 36 AA AA AA D5 D6 B6 D5'π '91 08 44 00 11 25 5A 95 AE 89 77 28 B6 6B B7 B7'π 'FF D6 DC D2 D1 04 45 55 15 4A A5 95 55 5B 56 AA'π 'E9 55 56 DD BB 2D 6B 2A 24 51 08 2A A4 4A B5 6A'π 'B5 76 CA D7 69 DA 6D 7E AE FD AB AD 04 52 D5 69'π '6A B5 5B 6A B6 AA AA D5 56 D6 AA A2 D6 FA D4 D4'π '89 04 00 80 09 95 2A AB 65 8D B5 5A D6 A7 DB ED'π 'FD 57 7E D5 51 04 0A C2 15 4A A4 95 55 55 55 2A'π 'AA 99 55 5F AD 8B 5B 55 22 10 21 2A A2 2A D5 56'π '9E 77 56 B5 2D 5D 76 FF FB FD D5 2A 82 29 AA 95'π '6A B5 5B 6A AA B5 AA D5 55 66 AA A5 5B 7A AA AA'π '48 40 44 00 09 55 56 ED 71 DD 6D 6A F5 AA AD DB'π 'AE AA BA D4 24 4A 2A A4 95 4A AA 96 D5 4A 55 AA'π 'AA 9A B5 5A B6 A6 D5 54 92 84 80 55 52 55 B9 2A'π 'AF 57 5A D5 8A B5 EB BF 7D FF EF 55 4A 91 4A 89'π '6A B5 55 6D 2D B5 56 55 6A B5 4A A5 CD 5D 56 AB'π '44 08 04 80 04 AB 46 D5 52 BA F5 AB 7B 4B 5F 7B'π 'DA AB 5A AA 10 24 2A B2 95 4A B7 5A DA 4B A9 AA'π 'D5 6A B5 5B 7B B9 AD 52 11 20 89 15 29 5A BD AA'π 'ED 6F AB 54 A6 B6 B6 F7 7F FE F5 55 45 49 55 04'π '6A B5 A8 A5 55 B6 56 AD AA D5 6A AA 95 67 5A AD'π 'A4 09 10 20 42 A5 51 56 95 59 7E AF 59 55 6D EE'π 'FB AB A6 A8 28 12 55 52 95 4B 57 5A AA AD'πENDπππOBJECT BITMAP πBEGINπ '42 4D 26 05 00 00 00 00 00 00 76 00 00 00 28 00'π '00 00 28 00 00 00 3C 00 00 00 01 00 04 00 00 00'π '00 00 B0 04 00 00 00 00 00 00 00 00 00 00 00 00'π '00 00 00 00 00 00 00 00 00 00 00 00 BF 00 00 BF'π '00 00 00 BF BF 00 BF 00 00 00 BF 00 BF 00 BF BF'π '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'π '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'π '00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00'π '00 00 00 00 00 00 00 00 00 00 0B BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB B0 0B BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB B0 0B BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB B0 0B BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB B0 0B BB BB BB BB 00 00 BB BB BB BB BB BB BB'π 'BB BB BB BB BB B0 0B BB BB BB B0 00 00 0B BB BB'π 'BB BB BB BB BB BB BB BB BB B0 0B BB BB BB 00 00'π '00 00 BB BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB B0 00 00 00 00 0B BB BB BB BB BB BB BB BB BB'π 'BB B0 0B BB BB B0 00 00 00 00 0B BB BB BB BB BB'π 'BB BB BB BB BB B0 0B BB BB B0 00 00 00 00 0B BB'π 'BB BB BB BB BB BB BB BB BB B0 0B BB BB B0 00 00'π '00 00 0B BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB 00 00 00 00 BB BB BB BB BB BB BB BB BB BB'π 'BB B0 0B BB BB BB B0 00 00 0B BB BB BB BB BB BB'π 'BB BB BB BB BB B0 0B BB BB BB BB 00 00 BB BB BB'π 'BB BB BB BB BB BB BB BB BB B0 0B BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB B0 0B BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB B0 0B BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB B0 0B BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB B0 0B BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB B0 0B BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB B0 0B BB BB BB BB BB'π 'BB BB BB 00 00 BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB B0 00 00 0B BB BB BB BB BB BB'π 'BB B0 0B BB BB BB BB BB BB BB 00 00 00 00 BB BB'π 'BB BB BB BB BB B0 0B BB BB BB BB BB BB B0 00 00'π '00 00 0B BB BB BB BB BB BB B0 0B BB BB BB BB BB'π 'BB B0 00 00 00 00 0B BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB B0 00 00 00 00 0B BB BB BB BB BB'π 'BB B0 0B BB BB BB BB BB BB B0 00 00 00 00 0B BB'π 'BB BB BB BB BB B0 0B BB BB BB BB BB BB BB 00 00'π '00 00 BB BB BB BB BB BB BB B0 0B BB BB BB BB BB'π 'BB BB B0 00 00 0B BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB 00 00 BB BB BB BB BB BB BB'π 'BB B0 0B BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB B0 0B BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB B0 0B BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB B0 0B BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB B0 0B BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB B0 0B BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB B0 0B BB BB BB BB BB BB BB BB BB BB BB BB 00'π '00 BB BB BB BB B0 0B BB BB BB BB BB BB BB BB BB'π 'BB BB B0 00 00 0B BB BB BB B0 0B BB BB BB BB BB'π 'BB BB BB BB BB BB 00 00 00 00 BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB B0 00 00 00 00 0B BB'π 'BB B0 0B BB BB BB BB BB BB BB BB BB BB B0 00 00'π '00 00 0B BB BB B0 0B BB BB BB BB BB BB BB BB BB'π 'BB B0 00 00 00 00 0B BB BB B0 0B BB BB BB BB BB'π 'BB BB BB BB BB B0 00 00 00 00 0B BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB BB 00 00 00 00 BB BB'π 'BB B0 0B BB BB BB BB BB BB BB BB BB BB BB B0 00'π '00 0B BB BB BB B0 0B BB BB BB BB BB BB BB BB BB'π 'BB BB BB 00 00 BB BB BB BB B0 0B BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB B0 0B BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB B0 0B BB BB BB BB BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB B0 0B BB BB BB BB BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 0B BB'π 'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB'π 'BB B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00'π '00 00 00 00 00 00'πENDπππMAIN MENU πBEGINπ MENUITEM "&About...", 102π MENUITEM "Draw Image", 101πENDπππABOUT DIALOG 41, 33, 146, 132πSTYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENUπCAPTION "About"πFONT 8, "Helv"πBEGINπ CONTROL "Bitmap Dragging Sample", -1, "STATIC", SS_CENTER | WS_CHILD | WS_VISIBLE, 0, 6, 144, 8π CONTROL "Purpose: Demonstrates smooth bitmap dragging. Select ""Draw Image"" to draw the domino, then drag it around using the mouse.", 103, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 6, 19, 136, 42π CONTROL "Written by: Michael Vincze", 101, "STATIC", SS_CENTER | WS_CHILD | WS_VISIBLE | WS_GROUP, 0, 65, 146, 9π CONTROL "Adapted from: Patrick Schreier of", -1, "STATIC", SS_CENTER | WS_CHILD | WS_VISIBLE, 2, 75, 144, 8π CONTROL "Microsoft Windows Developer Support", -1, "STATIC", SS_CENTER | WS_CHILD | WS_VISIBLE, 2, 85, 144, 8π CONTROL "Copyright \251 1993 Vincze International", 102, "STATIC", SS_CENTER | WS_CHILD | WS_VISIBLE | WS_GROUP, 0, 95, 146, 8π CONTROL "Portions Copyright \251 1992 Microsoft Corp.", 102, "STATIC", SS_CENTER | WS_CHILD | WS_VISIBLE | WS_GROUP, 0, 105, 146, 8π CONTROL "OK", 1, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 57, 115, 32, 14πENDπππAPPLICATION ICON πBEGINπ '00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'π '00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'π '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00'π '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'π '00 00 00 00 BF 00 00 BF 00 00 00 BF BF 00 BF 00'π '00 00 BF 00 BF 00 BF BF 00 00 C0 C0 C0 00 80 80'π '80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'π '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00'π '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'π 'BB BB BB BB BB BB BB BB BB BB 00 00 00 00 00 00'π 'BB 30 00 0B BB BB BB BB BB BB 03 00 00 00 00 00'π 'B3 00 00 00 BB BB BB BB BB BB 03 30 00 00 00 00'π 'B3 00 00 00 BB BB BB BB BB BB 03 33 00 00 00 00'π 'B3 00 00 00 BB BB BB BB BB BB 03 33 00 00 00 00'π 'B3 00 00 00 BB BB BB BB BB BB 03 33 00 00 00 00'π 'BB 30 00 03 BB BB BB BB BB BB 03 33 00 00 00 00'π 'BB B3 33 3B BB BB BB BB BB BB 03 33 00 00 00 00'π 'BB BB BB BB BB BB BB BB BB BB 03 33 00 00 00 00'π 'BB BB BB BB BB BB BB BB BB BB 03 33 00 00 00 00'π 'BB BB BB B3 00 00 BB BB BB BB 03 33 00 00 00 00'π 'BB BB BB 30 00 00 0B BB BB BB 03 33 00 00 00 00'π 'BB BB BB 30 00 00 0B BB BB BB 03 33 00 00 00 00'π 'BB BB BB 30 00 00 0B BB BB BB 03 33 00 00 00 00'π 'BB BB BB 30 00 00 0B BB BB BB 03 33 00 00 00 00'π 'BB BB BB B3 00 00 3B BB BB BB 03 33 00 00 00 00'π 'BB BB BB BB 33 33 BB BB BB BB 03 33 00 00 00 00'π 'BB BB BB BB BB BB BB BB BB BB 03 33 00 00 00 00'π 'BB BB BB BB BB BB BB BB BB BB 03 33 00 00 00 00'π 'BB BB BB BB BB BB 30 00 0B BB 03 33 00 00 00 00'π 'BB BB BB BB BB B3 00 00 00 BB 03 33 00 00 00 00'π 'BB BB BB BB BB B3 00 00 00 BB 03 33 00 00 00 00'π 'BB BB BB BB BB B3 00 00 00 BB 03 33 00 00 00 00'π 'BB BB BB BB BB B3 00 00 00 BB 03 33 00 00 00 00'π 'BB BB BB BB BB BB 30 00 03 BB 03 33 00 00 00 00'π 'BB BB BB BB BB BB B3 33 3B BB 03 33 00 00 00 00'π '00 00 00 00 00 00 00 00 00 00 03 33 00 00 00 00'π '0B BB BB BB BB B 12 11-26-9317:06ALL MICHAEL VINCZE Windows File Copy SWAG9311 12 Kx π{πWINDOWS File CopyπMichael Vinczeπmav@asd470.dseg.ti.comπ}ππusesπ WinTypes,π WinProcs,π Objects;ππconstπ BufStreamSize = $400;ππvarπ InBufStream : TBufStream;π OutBufStream: TBufStream;π C : Byte;ππprocedure Gasp;πvarπ Msg: TMsg;πbeginπwhile PeekMessage (Msg, 0, 0, 0, pm_Remove) doπ with Msg doπ if (Message < wm_KeyFirst) or (Message > wm_MouseLast) orπ ((Message > wm_KeyLast) and (Message < wm_MouseFirst)) thenπ beginπ TranslateMessage (Msg);π DispatchMessage (Msg);π end;πend;ππ{ function copies one file to the other. The return codeπ is the same as the TBufStream return codes. The Gaspπ procedure is inserted to yield for other applicationsπ during a copy.π}πfunction MyCopy (InFileName, OutFileName: PChar): Word;πbeginπInBufStream.Init (InFileName, stOpenRead, BufStreamSize);πif InBufStream.Status <> stOk thenπ beginπ MyCopy := InBufStream.Status;π endπelseπ beginπ OutBufStream.Init (OutFileName, stCreate, BufStreamSize);π if OutBufStream.Status <> stOk thenπ beginπ MyCopy := OutBufStream.Status;π endπ elseπ beginπ InBufStream.Read (C, 1);π while InBufStream.Status = stOk doπ beginπ Gasp;π OutBufStream.Write (C, 1);π InBufStream.Read (C, 1);π end;π end;π end;πInBufStream.Done;πOutBufStream.Done;πend;π 13 11-26-9317:49ALL STEVE WILLER Windows 3-D frames SWAG9311 91 Kx { Frames unit - a set of comprehensive (for my purposes) functions forπ drawing pretty 3-D frames of all types. Pretty simple stuff - I'm sureπ you will be able to figure it out - but that's why I included it.π As always, you are welcome to do whatever with this unit. I only ask thatπ if you upload it somewhere modified, keep my name off it, so I don't haveπ to answer for your bad code <grin>. If you have any suggestions orπ questions, by all means send them to me - I'd love to hear from a fellowπ programmer.π Steve Willerπ Mark Data Managementπ CIS: 70400,3667π AOL: SteveWillπ}ππunit frames;ππinterfaceπuses WinTypes,WinProcs,WinDOS;πprocedure DrawBorderFrame(PaintDC:HDC;PaintR:TRect;Back:boolean);πprocedure DrawOutFrame(PaintDC:HDC;PaintR:TRect;Back:boolean;Width:integer);πprocedure DrawInFrame(PaintDC:HDC;PaintR:TRect;Back:boolean;Width:integer);πprocedure DrawDivLine(PaintDC:HDC;Y:integer;Width:integer);πprocedure DrawDotLine(PaintDC:HDC;PaintR:TRect;Incr:integer);πfunction MakeBorBrush(HWindow:HWnd;BackColor1,BackColor2:TColorRef):HBrush;πprocedure DrawExplodeFrame(PaintDC:HDC;ExplR:TRect;PenColor,BrushColor:TColorRef;DrawBrush:boolean;Width:integer;π Steps:integer;Pause:longint);ππimplementationπprocedure DrawBorderFrame(PaintDC:HDC;PaintR:TRect;Back:boolean);πvar ThePen,OldPen:HPen;π FillBrush,OldBrush:HBrush;πbeginπ if Back thenπ beginπ FillBrush := CreateSolidBrush($00C0C0C0);π OldBrush := SelectObject(PaintDC,FillBrush);π InflateRect(PaintR,-1,-1);π FillRect(PaintDC,PaintR,FillBrush);π InflateRect(PaintR,1,1);π SelectObject(PaintDC,OldBrush);π DeleteObject(FillBrush);π end;ππ OldBrush := SelectObject(PaintDC,GetStockObject(Null_Brush));π ThePen := CreatePen(ps_Solid,1,$00C0C0C0);π OldPen := SelectObject(PaintDC,ThePen);π PaintR.top:=PaintR.top+1;π PaintR.left:=PaintR.left-1;π Rectangle(PaintDC,PaintR.left,PaintR.top,PaintR.right,PaintR.bottom);π PaintR.top:=PaintR.top-1;π PaintR.left:=PaintR.left+1;π SelectObject(PaintDC,OldPen);π DeleteObject(ThePen);π SelectObject(PaintDC,OldBrush);ππ ThePen := CreatePen(ps_Solid,1,RGB(255,255,255));π OldPen := SelectObject(PaintDC,ThePen);π MoveTo(PaintDC,PaintR.right,PaintR.top);π LineTo(PaintDC,PaintR.left,PaintR.top);π LineTo(PaintDC,PaintR.left,PaintR.bottom);π MoveTo(PaintDC,PaintR.left+2,PaintR.bottom-2);π LineTo(PaintDC,PaintR.right-2,PaintR.bottom-2);π LineTo(PaintDC,PaintR.right-2,PaintR.top+2);π SelectObject(PaintDC,OldPen);π DeleteObject(ThePen);ππ ThePen := CreatePen(ps_Solid,1,RGB(127,127,127));π OldPen := SelectObject(PaintDC,ThePen);π MoveTo(PaintDC,PaintR.right-2,PaintR.top+2);π LineTo(PaintDC,PaintR.left+2,PaintR.top+2);π LineTo(PaintDC,PaintR.left+2,PaintR.bottom-3);π MoveTo(PaintDC,PaintR.left,PaintR.bottom);π LineTo(PaintDC,PaintR.right,PaintR.bottom);π LineTo(PaintDC,PaintR.right,PaintR.top);π SelectObject(PaintDC,OldPen);π DeleteObject(ThePen);πend;ππprocedure DrawOutFrame (PaintDC:HDC; PaintR:TRect; Back:boolean; Width:integer);πvarπ ThePen, OldPen:HPen;π FillBrush, OldBrush:HBrush;π count:integer;π CalcR:TRect;πbeginπif Back thenπ beginπ FillBrush := CreateSolidBrush ($00C0C0C0);π OldBrush := SelectObject(PaintDC,FillBrush);π InflateRect (PaintR, -1*(Width)+1, -1*(Width)+1);π FillRect (PaintDC,PaintR,FillBrush);π InflateRect (PaintR,Width-1,Width-1);π SelectObject (PaintDC,OldBrush);π DeleteObject (FillBrush);π end;ππCalcR := PaintR;ππfor count:=0 to (Width-1) doπ beginπ PaintR := CalcR;π InflateRect (PaintR, -1*(count), -1*(count));ππ ThePen := CreatePen(ps_Solid,1,RGB(255,255,255));π OldPen := SelectObject(PaintDC,ThePen);π MoveTo (PaintDC,PaintR.right,PaintR.top);π LineTo (PaintDC,PaintR.left,PaintR.top);π LineTo (PaintDC,PaintR.left,PaintR.bottom+1);π SelectObject (PaintDC,OldPen);π DeleteObject (ThePen);ππ ThePen := CreatePen (ps_Solid,1,RGB(127,127,127));π OldPen := SelectObject (PaintDC,ThePen);π MoveTo (PaintDC,PaintR.right,PaintR.top+1);π LineTo (PaintDC,PaintR.right,PaintR.bottom);π LineTo (PaintDC,PaintR.left,PaintR.bottom);π SelectObject (PaintDC,OldPen);π DeleteObject (ThePen);π end;πend;ππprocedure DrawInFrame(PaintDC:HDC;PaintR:TRect;Back:boolean;Width:integer);πvar ThePen,OldPen:HPen;π FillBrush,OldBrush:HBrush;π count:integer;π CalcR:TRect;πbeginπ if Back thenπ beginπ FillBrush := CreateSolidBrush($00C0C0C0);π OldBrush := SelectObject(PaintDC,FillBrush);π InflateRect(PaintR,-1*(Width)+1,-1*(Width)+1);π FillRect(PaintDC,PaintR,FillBrush);π InflateRect(PaintR,Width-1,Width-1);π SelectObject(PaintDC,OldBrush);π DeleteObject(FillBrush);π end;ππ CalcR:=PaintR;ππ for count:=0 to (Width-1) doπ beginπ PaintR:=CalcR;π InflateRect(PaintR,-1*(count),-1*(count));ππ ThePen := CreatePen(ps_Solid,1,RGB(127,127,127));π OldPen := SelectObject(PaintDC,ThePen);π MoveTo(PaintDC,PaintR.right,PaintR.top);π LineTo(PaintDC,PaintR.left,PaintR.top);π LineTo(PaintDC,PaintR.left,PaintR.bottom);π SelectObject(PaintDC,OldPen);π DeleteObject(ThePen);ππ ThePen := CreatePen(ps_Solid,1,RGB(255,255,255));π OldPen := SelectObject(PaintDC,ThePen);π MoveTo(PaintDC,PaintR.right,PaintR.top+1);π LineTo(PaintDC,PaintR.right,PaintR.bottom);π LineTo(PaintDC,PaintR.left-1,PaintR.bottom);π SelectObject(PaintDC,OldPen);π DeleteObject(ThePen);π end;πend;ππprocedure DrawDivLine(PaintDC:HDC;Y:integer;Width:integer);πvar ThePen,OldPen:HPen;π FillBrush,OldBrush:HBrush;π count:integer;πbeginπ ThePen := CreatePen(ps_Solid,Width,RGB(127,127,127));π OldPen := SelectObject(PaintDC,ThePen);π MoveTo(PaintDC,GetSystemMetrics(sm_CXScreen),Y);π LineTo(PaintDC,0,Y);π SelectObject(PaintDC,OldPen);π DeleteObject(ThePen);π Y:=Y+Width;π ThePen := CreatePen(ps_Solid,Width,RGB(255,255,255));π OldPen := SelectObject(PaintDC,ThePen);π MoveTo(PaintDC,GetSystemMetrics(sm_CXScreen),Y);π LineTo(PaintDC,0,Y);π SelectObject(PaintDC,OldPen);π DeleteObject(ThePen);πend;ππprocedure DrawDotLine(PaintDC:HDC;PaintR:TRect;Incr:integer);πvar ROP2:integer;π count:integer;πbeginπ ROP2 := GetROP2(PaintDC);π SetROP2(PaintDC,r2_Not);π count := PaintR.left;π while count < PaintR.right-1 doπ beginπ SetPixel(PaintDC,count,PaintR.top,$00000000);π SetPixel(PaintDC,count,PaintR.bottom-1,$00000000);π count := count + Incr;π end;π count := PaintR.top+2;π while count < PaintR.bottom-1 doπ beginπ SetPixel(PaintDC,PaintR.left,count,$00000000);π SetPixel(PaintDC,PaintR.right-1,count,$00000000);π count := count + Incr;π end;π SetROP2(PaintDC,ROP2);πend;πππfunction MakeBorBrush(HWindow:HWnd;BackColor1,BackColor2:TColorRef):HBrush;πvar DC,MemDC:HDC;π Bits:HBitmap;π FillR:TRect;π TheBrush,OldBrush:HBrush;πbeginπ DC:=CreateDC('display',nil,nil,nil);π MemDC:=CreateCompatibleDC(DC);π Bits:=CreateCompatibleBitmap(DC,8,8);π SelectObject(MemDC,Bits);π if Bits<>0 thenπ beginπ TheBrush:=CreateSolidBrush(GetNearestColor(DC,BackColor2));π OldBrush:=SelectObject(MemDC,TheBrush);π PatBlt(MemDC,0,0,8,8,Blackness);π with FillR do beginπ left:=0;right:=8;top:=0;bottom:=8;π end;π FillRect(MemDC,FillR,TheBrush);π SelectObject(MemDC,OldBrush);π DeleteObject(TheBrush);π SetPixel(MemDC,0,0,BackColor1);π SetPixel(MemDC,0,2,BackColor1);π SetPixel(MemDC,0,4,BackColor1);π SetPixel(MemDC,0,6,BackColor1);π SetPixel(MemDC,2,0,BackColor1);π SetPixel(MemDC,2,2,BackColor1);π SetPixel(MemDC,2,4,BackColor1);π SetPixel(MemDC,2,6,BackColor1);π SetPixel(MemDC,4,0,BackColor1);π SetPixel(MemDC,4,2,BackColor1);π SetPixel(MemDC,4,4,BackColor1);π SetPixel(MemDC,4,6,BackColor1);π SetPixel(MemDC,6,0,BackColor1);π SetPixel(MemDC,6,2,BackColor1);π SetPixel(MemDC,6,4,BackColor1);π SetPixel(MemDC,6,6,BackColor1);π MakeBorBrush:=CreatePatternBrush(Bits);π end else MakeBorBrush:=0;π DeleteDC(MemDC);π DeleteDC(DC);π DeleteObject(Bits);πend;ππprocedure DrawExplodeFrame(PaintDC:HDC;ExplR:TRect;PenColor,BrushColor:TColorRef;DrawBrush:boolean;Width:integer;π Steps:integer;Pause:longint);πvar count:integer;π dX,dY:double;π ThePen,OldPen:HPen;π TheBrush,OldBrush:HBrush;π OrigR:TRect;π TimeCount:longint;πbeginπ ThePen := CreatePen(ps_Dot,Width,PenColor);π OldPen := SelectObject(PaintDC,ThePen);π if DrawBrush thenπ TheBrush:=CreateSolidBrush(BrushColor) elseπ TheBrush := GetStockObject(Null_Brush);π OldBrush:= SelectObject(PaintDC,TheBrush);π dY:=(ExplR.bottom-ExplR.top)/Steps;π dX:=(ExplR.right-ExplR.left)/Steps;π with ExplR doπ beginπ left:=left+((right-left) div 2);π top:=top+((bottom-top) div 2);π right:=left;bottom:=top;π end;π OrigR:=ExplR;π for count:=1 to steps doπ beginπ with ExplR doπ beginπ TimeCount := GetTickCount;π left:=OrigR.left-integer(Round(dX*count));π right:=OrigR.right+integer(Round(dX*count));π bottom:=OrigR.bottom-integer(Round(dY*count));π top:=OrigR.top+integer(Round(dY*count));π Rectangle(PaintDC,left,top,right,bottom);π while (GetTickCount - TimeCount) < Pause do begin end;π end;π end;π SelectObject(PaintDC,OldBrush);π DeleteObject(TheBrush);π SelectObject(PaintDC,OldPen);π DeleteObject(ThePen);πend;ππbeginπend.π 14 11-02-9305:32ALL SWAG SUPPORT TEAM DOS in OS2 SWAG9311 10 Kx {πTREVOR@wordperfect.comππBelow is a dinky program to start a os/2 program from a os/2 dos window.πIt's pretty ugly right now, but it works fairly well. I dug this up byπdebugging VIEW.EXE, so there may be errors or omissions. Anyone can haveπthis, feel free to mutilate it in any way you wish.π}ππprogram dosstart;ππvarπ buf : array[0..8] of PChar;π dir,π title,π fname,π opts : string;π i : integer;πbeginπ if paramcount > 0 thenπ beginπ fillchar(buf, sizeof(buf), 0);π buf[0] := ptr(0, $20);π title := 'Blah blah: ' + paramstr(1) + #0; { window title }π buf[2] := @title[1];π fname := paramstr(1);π fname := fname + #0;π buf[3] := @fname[1];π if paramcount > 1 thenπ beginπ opts := '';π for i := 2 to paramcount doπ opts := opts + paramstr(i);π opts := opts + #0;π buf[4] := @opts[1];π end;π asmπ mov ax, 6400hπ mov bx, 0025hπ mov cx, 636chπ mov si, offset bufπ int 21hπ end;π endπ elseπ beginπ writeln('USAGE:');π writeln(' DOSSTART.EXE OS2PROG [OS2PROG_OPTIONS]');π writeln;π end;πend.ππ